C# 单例数据访问层
在我们工作的数据访问层中,我们有一个标准实现,通过一个单例公共属性访问该类,该属性如下所示:C# 单例数据访问层,c#,design-patterns,singleton,C#,Design Patterns,Singleton,在我们工作的数据访问层中,我们有一个标准实现,通过一个单例公共属性访问该类,该属性如下所示: public static CustomerController Instance { get { lock(singletonLock) { if( _instance == null ) {
public static CustomerController Instance
{
get
{
lock(singletonLock)
{
if( _instance == null )
{
_instance = new CustomerController();
}
return _instance;
}
}
}
现在,我明白了代码在做什么,但我想知道为什么每次使用时只创建一个类的实例就可以这样做?编辑:哦,哎呀,我没听清楚“数据访问层”部分。但我也有一个这样的例子:如果你的多线程应用程序通过一个单实例类调用它的所有数据库,那么一次只能有一个线程访问数据库,从而避免了竞争条件 如果在多线程应用程序中有一个日志记录机制,用来抛出所有异常并只写入信息(特别是对于总是在运行的服务或应用程序,每当出现问题时都打印状态),那么您将遇到文件锁定问题。我使用一个单例记录器类,因此只有一个线程可以访问记录器,其余线程将等待记录器在文本文件中自由写入它们的行
使用singleton有很多很酷的理由,但我和你一样,不知道它们是干什么的,直到我在多线程应用程序中遇到文件访问问题。你可能也希望这样做,它的双重检查锁定,它将加快对singleton的访问速度
public static CustomerController Instance
{
get
{
if( _instance == null )
{
lock(singletonLock)
{
if( _instance == null )
{
_instance = new CustomerController();
}
}
}
return _instance;
}
}
答案很简单:每次使用对象时,您都希望得到相同的对象
它提供了作为全局变量(即只有一个)的优势和作为类对象的优势(除其他外,它可以在第一次需要时进行不可见的初始化)。我可以理解在这种情况下需要单例,但是如果您正在访问数据库,是否真的需要一个类的单例实例?数据库是什么?我说的是写一个文本文件,在这种情况下,你一次只能有一个线程访问一个文件。哦,对不起,我以为你在问什么是单件一般。“数据访问层”部分从未单击过,抱歉!为什么把它作为一个全局变量是件好事呢?似乎这只是为了单身而单身。有时候单身对你没有任何好处。如果你的应用程序是单线程的,你就不需要它是单线程的。但是,如果从一开始就将其设置为单线程,则不会产生任何负面影响,而且如果将来将其设置为多线程,则不必重构。@lomaxx:您不希望将其作为全局变量。首先,这是名称空间污染。其次,必须对其进行初始化。一个单身汉解决了这两个问题。@goldenratio:它与线程无关。单例意味着您可以在任何地方请求它,代码将始终返回相同的对象。代码不必到处传递资源。如果它不需要,它也不会要求。