我有一个应用程序,它将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.
}
答案 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层中的连接字符串。你真的应该只在组合根目录中访问这些信息。