使用 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.
}

使用 StructureMap 对具有多个数据库字符串的 DAL 进行依赖关系注入

你需要

一个抽象工厂。看看这个问题的答案,看看一些例子。

在您的特定情况下,抽象工厂界面应如下所示:

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 层中的连接字符串。您确实应该仅在组合根中访问此类信息。