在一般的全局状态下,无论是全局类还是单例,都应该尽可能避免。
理想的解决方案是让您的应用程序从配置中加载连接字符串并inject将其放入任何需要它的类中。根据您的应用程序的大小,IoC类似容器Unity or 温莎城堡可以提供帮助,但肯定不是解决方案的必需部分。
如果这不是一个选择,并且您被迫维护全局状态(由于现有的代码库或其他原因),我不知道您建议的两种方法之间存在巨大差异。
Update:只是为了澄清一下,暂时忘记有关 IoC 容器的所有内容,“注入”只是“作为参数传递”的一种奇特方式(或者传递给类的构造函数,或者通过属性,或者其他方式)。
数据访问类不必要求连接字符串(来自某种全局或单例),而是通过构造函数或属性传入。
更新#2:我认为对于这种方法的含义仍然存在一些误解。
它基本上取决于您的数据访问类是否如下所示:
public class DataAccessClass
{
public DataAccessClass()
{
_connString = SomeStaticThing.GetConnectionString();
}
}
or
public class DataAccessClass
{
public DataAccessClass(string connString)
{
_connString = connString;
}
}
These articles(事实上,该博客中的许多文章)详细说明了后者比前者更好的许多原因(尤其是因为前者几乎不可能进行单元测试)。
Yes, at 某个地方首先必须有一些静态人员负责获取连接字符串,但关键是您对静态方法的依赖仅限于该一个点(这可能是该过程中的 Main 方法)引导您的应用程序),而不是散布在整个代码库中。