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