Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单例数据访问层_C#_Design Patterns_Singleton - Fatal编程技术网

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:它与线程无关。单例意味着您可以在任何地方请求它,代码将始终返回相同的对象。代码不必到处传递资源。如果它不需要,它也不会要求。