2016-09-22 65 views
-1

我有一個實例類,它實現了一個接口,並且除接口方法以外的所有方法都是靜態的。所有的類變量也是靜態的。其中兩個靜態變量實際上是實例變量,並標記爲只讀。這些只讀實例變量是內聯初始化的。ReadOnly C#類中的引用變量

下面是一個例子

public class Test : ITestInterface 
{ 

    public static readonly DbConnection Connection = new DbConnection(); 

    public void static TestMethod1(){ 
    } 

    public List<string> static TestMethod2(){ 
    } 

} 

我有很多的方法,在使用靜態連接可變我的框架層。

這是一個有效的設計?我想爲我所有的API調用使用相同的對象。這個想法是爲了避免創建多個連接對象。在客戶端調用負載的任何一天,都有可能創建10,000個連接對象。我試圖避免這種情況。

+0

這就是連接池的用途。連接對象應該是短暫的。儘可能在最後時刻創建並儘快銷燬它。讓連接池負責創建/彙集連接以供重用。 – Kevin

+0

這不是Sqlconnection,它是第三方消息系統連接類。 – Chiran

+0

我嚴重懷疑這個第三方連接是線程安全的,這將使它很難正確使用。除非你真的只從一個線程中調用它。您遇到的另一個主要問題是,如果連接中斷並變得不可用,會發生什麼情況。你將如何安全地重新初始化它? –

回答

0

這樣做是爲了避免造成多發性連接對象

,是爲了處理這種情況的圖案是Singleton模式。也不是你需要必須以這種方式實現。但這是一個普遍的指導原則。

在你的具體例子中,你可以做的是渲染類private的類。

public class Test : ITestInterface 
{ 
    ... 
    private Test() {} 
    .. 
} 

這將使創建一個類的實例變得不可能,並且從中推導出來。所以你的Test類的消費者將沒有其他選擇,那麼只能訪問static成員。

但是總的來說,我強烈建議你看看上面鏈接的模式。它可能會對你在做什麼以及如何閃耀你想要做的。

+0

非常感謝。我會研究一下 – Chiran

0

幾件事情,首先你基本上使用連接作爲單身。這可以是一個完美的設計模式,但有一些考慮,讓我擔心你使用它像你發佈。

  1. 你有多個線程訪問它嗎?連接線程安全嗎?所有的變量都是線程安全的嗎?如果不是,你正在尋找麻煩。

  2. 您是否確實希望在應用程序的整個生命週期內保持一個連接打開?如果連接關閉會發生什麼?單身人士通常是處理這類問題的經理,而不是單一資源。

  3. 您是否知道多連接效率低下?大多數連接層(如SQL)管理連接池,可非常有效地管理連接,而無需擔心連接。這通常是一個更好的模式,除非你能與您可以管理在資源是真正的全球性的和不變的只有在情況下,連接自己更有效地

我會用單身謹慎和性能計數器證明,以及作爲線程安全。如果它是全球性的,但需要管理和線程安全(認爲連接),那麼你最好添加一個自定義管理器類。但是,只有在可以證明您可以手動處理更多連接和吞吐量的情況下,才能使用正常連接池來執行此操作。

+0

我的測試類是通過IIS的應用程序初始化特性運行的,並且只在一個線程中運行。 – Chiran