我有多个DLL用于将数据读/写到我的数据库中。
有一个表示层DLL和一个数据访问层DLL。我希望这些DLL共享一组连接字符串。
我的想法是将连接字符串存储在外部配置文件中的单独DLL中。我不确定这是不是一个好主意,我是否可以在表示和数据访问层中引用外部DLL。
另一个问题是我是否应该编写一个辅助类来读取外部配置文件中的数据,或者我是否应该使用内置的.Net方法?
谢谢
答案 0 :(得分:2)
在单独的类中隔离配置文件访问代码。通过该类上的接口提供配置数据(connectionstrings和whatnot)。让界面存在于共享程序集中。让任何需要此接口的类通过dependency injection获取对配置类实例的引用。如果您还没有使用DI框架,我强烈推荐Autofac。
你取得了什么成绩?现在,表示和数据访问类仅依赖于共享接口定义。他们不关心该接口的实现是什么,无论是从web.config,machine.config还是其他商店读取连接字符串。更好的是,您现在可以通过faking实施更轻松地测试您的课程。
更新:首先,说明通过接口提供配置数据。假设我们有以下配置服务:
public interface IConfigurationService
{
string ConnectionString {get;}
}
public class ConfigurationService : IConfigurationService
{
string ConnectionString {get;}
public ConfigurationService()
{
// load configuration
}
}
我的数据访问类可以直接使用此类:
public class DataAccess
{
private string _connectionString;
public DataAccess()
{
var config = new ConfigurationService();
_connectionString = config.ConnectionString;
}
}
这种方法的问题是耦合。 DataAccess
现在直接依赖于ConfigurationService
类。我们为DataAccess
编写的任何测试都会无意中受到ConfigurationService
类的影响。此外,如果我们需要切换ConfigurationService
的实现,则需要更改DataAccess
(以及所有其他直接依赖此类的类)。
要解决这个问题,我们反转依赖层次结构并引用接口而不是具体类,如下所示:
public class DataAccess
{
private string _connectionString;
public DataAccess(IConfigurationService configurationService)
{
_connectionString = configurationService.ConnectionString;
}
}
数据访问类现在无视配置服务实现是什么以及如何创建该实例。
答案 1 :(得分:1)
据我所知,DLL文件无法使用app.config文件等.net配置项,所以如果你想通过一个xml文件来配置你的dll,你必须自己编写它
答案 2 :(得分:0)
我可以将连接字符串存储在machine.config中,但再一次不确定所有含义......