2010-05-03 68 views
2

我在c#中创建了一个Singleton类,其中有一个公共属性,我想在初次调用Singleton时进行初始化。Singleton constructor question

这是我写的代码:

public class BL 
{ 
    private ISessionFactory _sessionFactory; 
    public ISessionFactory SessionFactory 
    { 
     get { return _sessionFactory; } 
     set { _sessionFactory = value; } 
    } 

    private BL() 
    { 
     SessionFactory = Dal.SessionFactory.CreateSessionFactory(); 
    } 

    private object thisLock = new object(); 

    private BL _instance = null; 
    public BL Instance 
    { 
     get 
     { 
      lock (thisLock) 
      { 
       if (_instance == null) 
       { 
        _instance = new BL(); 
       } 
       return _instance; 
      } 
     } 
    } 
} 

据我知道,当我解决了第一次BL类的实例BL对象,它应该加载构造,这应该初始化SessionFactory对象。

但是,当我尝试: BL.Instance.SessionFactory.OpenSession(); 我得到一个空引用异常,并且我看到SessionFactory为空...

为什么?

+2

'BL.Instance'甚至不应该编译,因为'Instance'不是'static'属性......我认为'Instance','_instance'和'thisLock'都应该是'static'。 – Thomas 2010-05-03 06:55:22

+0

是Dal.SessionFactory.CreateSessionFactory();返回null? – Anthony 2010-05-03 06:56:50

+0

您使用的是C#/ .NET的哪个版本? – 2010-05-03 08:20:57

回答

3

这不是一个单身人士。你应该参考Jon Skeet关于singletons in C#的优秀指南。例如,使用此模式:

public sealed class Singleton 
{ 
    static readonly Singleton instance=new Singleton(); 

    // Explicit static constructor to tell C# compiler 
    // not to mark type as beforefieldinit 
    static Singleton() 
    { 
    } 

    Singleton() 
    { 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 
} 

请特别注意该实例是静态的。

+0

好的,然后我应该把ISessionFactory对象的启动放在哪里(Dal.SessionFactory.CreateSessionFactory();)? – gillyb 2010-05-04 19:33:59

+0

@gillyb:它看起来应该是类的只读实例成员,在构造函数中初始化。你可能想先阅读这个:http://stackoverflow.com/questions/185384/order-of-static-constructors-initializers-in-c – 2010-05-04 19:53:55