【发布时间】:2011-01-25 16:23:49
【问题描述】:
我有一个数据访问层库,我想使其“可移植”。我喜欢它可移植的原因是因为我想在具体服务器上使用 SQL Azure 和 Azure 文件存储(例如,数据 + pdf 报告)以及 Sql Server 2008R2 和文件系统存储。
根据规范,该系统应该与以后的实现一起上线(sql + 文件系统存储),而在达到一定的可扩展性阈值后,我们计划迁移到 Azure。
我使用的数据访问类实现了 IDataProvider 接口(我构建了它),它定义了任何数据访问具体实现应该具有的方法。使用数据访问层是通过传递 IDataProvider 接口并在其上调用方法来完成的,例如:
public Interface IDataProvider
{
public bool DoSomething();
}
public class AzureDataProvider : IDataProvider
{
private string ConnectionString;
public AzureDataProvider(string connectionString)
{
this.ConnectionString = connectionString;
}
public AzureDataProvider():this(
ConfigurationManager.ConnectionString["conn"].ConnectionString)
{
}
public bool DoSomething()
{
return false;
}
}
所以现在的问题是调用 IDataProvider 接口上的方法的消费者类必须执行以下操作:
public class DataAccessConsumer
{
public void SomeOperation()
{
AzureDataProvider azureProvider = new AzureDataProvider();
IDataProvider dataProvider = (IDataProvider)azureProvider;
bool result = dataProvider.DoSomething();
}
}
所以上面代码的问题是客户端仍然需要知道具体的 AzureDataProvider 类。我想要一种方法,只为客户端提供 IDataProvider 接口,而不向每个接口方法传递连接字符串,或者通过 ConfigurationManager 在每个方法中查找连接字符串。
这可能吗?抽象工厂或某种依赖注入容器模式可以解决问题吗?如果是这样,我将不胜感激代码示例或代码示例的链接。
【问题讨论】:
-
什么样的项目会使用你的数据访问代码?
标签: c# design-patterns dependency-injection theory factory-pattern