使用 StructureMap 的具有多个数据库字符串的 DAL 的依赖注入

Dependency Injection for DAL with multiple database strings using StructureMap

我有一个应用程序在我的业务层和 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 中,而不是在其他层中。我正在寻找有关如何执行此操作或为此需要研究哪些设计模式的建议。

更新信息 用户将确定需要使用哪个连接字符串。例如,他们会将数据从开发转移到测试,他们将 select 来源和目的地。

string source = \user selection from combobox.
if (source == "DEV")
{
     //Instantiate dev instance of manager
}
if (source == "TEST")
{ 
     //Instantiate Test Instance of manager.
}

你需要一个 abstract factory. Take a look at the answer in this question 来做一些例子。

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

public interface IDALManagerFactory
{
    IDALManager Create(string environment);
}

您需要创建此接口的实现,以创建一个 "DAL Manager" 和适当的连接字符串。

要做到这一点,您需要将连接字符串注入到 class 的构造函数中,如下所示:

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());
         //...
    }
}

这个工厂class应该住在Composition Root。您还可以访问此工厂内的容器 class 以创建 "DAL Manager".

现在,需要访问适当 "DAL Manager" 的 class 应该有一个 IDALManagerFactory 注入到它的构造函数中,它会使用这样的工厂来创建一个 IDALManager 通过调用传递环境名称的 Create 方法。

请注意,在您的代码中,您正在访问 DAL 层中的连接字符串。您真的应该只在组合根目录中访问此类信息。