2010-05-03 65 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