2013-02-27 44 views
3

我已經繼承了這段代碼,並且出於某種原因,原作者確實非常喜歡靜態只讀引用。對服務類使用靜態只讀引用有什麼問題嗎?

我已經在下面列出了一般模式,什麼後果不具有這些靜態只讀引用有哪些?

public class DbAccess 
{ 
    private static readonly ISomethingFactory = SomethingFactories.GetFactory("1"); 
    private static IThing1Dao Thing1Dao { get {return ISomethingFactory.Thing1Dao; }} 
    private static IThing2Dao Thing2Dao { get {return ISomethingFactory.Thing2Dao; }} 
} 

public class SomethingFactories 
{ 
    public static ISomethingFactory GetFactory(string key) 
    { 
     switch(key) 
     { 
     case "...": 
     return new SomeFactory(); 
     } 
    } 
}  

public class SomeFactory : ISomeFactory 
{  
    public IThing1Dao Thing1Dao 
    { 
     get { return new Thing1Dao(); } 
    } 
}  

public class SomeService : ISomeService 
{ 
    private static readonly IThing1Dao thing1Dao = DbAccess.Thing1Dao 
    private static readonly IThing2Dao thing2Dao = DbAccess.Thing2Dao 

    public Thing1Object1 GetObject1(int id) 
    { 
     return thing1Dao.GetObject1(id);  
    } 

    public Thing1Object2 GetObject2(int id) 
    { 
     return thing1Dao.GetObject2(id); 
    } 
} 

在.aspx頁的使用是這樣的:

public class MyBasePage : System.Web.UI.Page 
{ 
    protected static readonly SomeService someService = new SomeService();  
}  

public class SomeAspxPage : MyBasePage 
{ 
    void btnAddObject1(...) 
    { 
     Thing1Object1 obj1 = someService.GetObject(1); 
    } 
} 

回答

3

靜態意味着ISomethingFactory只有一個實例存在,並且該實例可以通過類型來訪問(未一個實例每個實例DbAccess)。

只讀表示初始化後,該值不能被覆蓋。

這是基於啓動時刻數據進行初始化一個相當正常模式(例如,從app.config中的數據)。

3

Web應用程序是多線程的,所以靜態成員的用途有限。

如果你有一個靜態引用一個對象,該對象必須是線程安全的,或者你有使用它來進行同步,以便只有一個線程可以在任何時候使用它。

使靜態參考只讀意味着基準本身是線程安全的,因爲一旦它的設置不能改變,但不會自動使對象,它的引用線程安全的。

+0

所以不會有任何鎖定/序列化問題? – loyalflow 2013-02-28 15:40:11

+0

@ user1361315:任何鎖定問題都取決於您所引用的對象以及您如何使用它。如果你想序列化屬性,那麼你有一個問題,因爲靜態成員不是序列化的,因爲它們不是對象實例的一部分。 – Guffa 2013-02-28 15:44:00

相關問題