使用 StructureMap 对具有多个数据库字符串的 DAL 进行依赖关系注入
本文关键字:DAL 依赖 注入 关系 字符串 数据库 StructureMap 使用 | 更新日期: 2023-09-27 17:56:26
我有一个应用程序,它在我的业务和DAL层中使用Structuremap for DI。 到目前为止,我一直在处理的每个环境都有一个 DAL。 所以我会从配置中获取它并将该值用于我的所有连接。 这方面的一个例子是。
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Database"].ToString()))
{
//Do a call to db here.
}
我使用结构图调用此方法,如下所示。
ObjectFactory.GetInstance<IDALManager>().MethodName();
现在我有一项新功能,我想允许用户在开发环境中进行更改,然后按下按钮将其提升到测试或生产环境。 因此,DAL 管理器的连接字符串需要能够更改。 我还想将所有连接字符串访问保留在 DAL 中,而不是在其他层中。 我正在寻找有关如何执行此操作或为此研究哪些设计模式的建议。
更新的信息用户将确定需要使用哪个连接字符串。 例如,他们将将数据从开发移动到测试,他们将选择源和目标。
string source = ''user selection from combobox.
if (source == "DEV")
{
//Instantiate dev instance of manager
}
if (source == "TEST")
{
//Instantiate Test Instance of manager.
}
你需要
一个抽象工厂。看看这个问题的答案,看看一些例子。
在您的特定情况下,抽象工厂界面应如下所示:
public interface IDALManagerFactory
{
IDALManager Create(string environment);
}
您需要创建此接口的实现,该实现使用适当的连接字符串创建"DAL 管理器"。
为了能够做到这一点,你需要将连接字符串注入到类的构造函数中,如下所示:
public class MyDalManager: IDALManager
{
private readonly string connectionString;
public MyDalManager(string connectionString)
{
this.connectionString = connectionString;
}
public MyMethod()
{
//..
using (SqlConnection con = new SqlConnection(connectionString))
{
//Do a call to db here.
}
}
}
现在工厂的实现将如下所示:
public class DALManagerFactory : IDALManagerFactory
{
public IDALManager Create(string environment)
{
if(environment == "DEV")
return new MyDalManager(
ConfigurationManager.ConnectionStrings["Database"].ToString());
//...
}
}
此工厂类应位于组合根中。您还可以访问此工厂类中的容器以创建"DAL 管理器"。
现在,需要访问相应"DAL 管理器"的类应将IDALManagerFactory
注入到其构造函数中,并且它将使用此类工厂通过调用传递环境名称的 Create
方法来创建IDALManager
。
请注意,在代码中,您正在访问 DAL 层中的连接字符串。您确实应该仅在组合根中访问此类信息。