【问题标题】:Dependency Injection for DAL with multiple database strings using StructureMap使用 StructureMap 对具有多个数据库字符串的 DAL 进行依赖注入
【发布时间】:2016-07-12 00:41:21
【问题描述】:

我有一个应用程序将 Structuremap for DI 用于我的业务和 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.
}

【问题讨论】:

  • 你在哪里打电话给这个ObjectFactory.GetInstance&lt;IDALManager&gt;().MethodName();?为什么要保留 DAL 中的所有连接字符串访问权限?
  • 我在业务层调用那个方法。我想将连接字符串保留在 DAL 中以实现关注点分离。真的这是我第一次使用 DI,我想要一些关于处理多个连接字符串的正确方法的指导。
  • 您将如何决定使用哪个连接字符串?你能提供一些伪代码来说明这种决定是如何做出的吗?
  • 添加了请求的信息。

标签: c# dependency-injection structuremap


【解决方案1】:

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

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

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

这个工厂类应该存在于Composition Root。您还可以访问此工厂类中的容器来创建“DAL 管理器”。

现在,需要访问适当“DAL 管理器”的类应该在其构造函数中注入一个IDALManagerFactory,并且它将使用这样的工厂通过调用传递环境的Create 方法来创建一个IDALManager名字。

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

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 2014-10-06
    相关资源
    最近更新 更多