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

时间:2016-07-11 15:42:04

标签: c# dependency-injection structuremap

我有一个应用程序,它将DI的Structuremap用于我的业务和DAL层。到目前为止,我每个环境都有一个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.
}

1 个答案:

答案 0 :(得分:0)

您需要abstract factory。在this question中查看一些示例中的答案。

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

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

您需要创建此接口的实现,以使用适当的连接字符串创建“DAL Manager”。

为了能够这样做,您需要将连接字符串注入到类的构造函数中,如下所示:

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

这个工厂类应该住在Composition Root。您还可以访问此工厂类中的容器以创建“DAL Manager”。

现在,需要访问相应“DAL Manager”的类应该在其构造函数中注入IDALManagerFactory,并且它将使用这样的工厂通过调用{{1}来创建IDALManager传递环境名称的方法。

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