2011-10-06 78 views
1

我有一個相當大的開源類,我需要從靜態轉換爲非靜態。將大類從靜態轉換爲非靜態的步驟是什麼?

我需要這樣做的原因是爲了使線程安全;我想要每個線程的類的一個副本。

一般來說,推薦將C#庫從靜態轉換爲非靜態的步驟是什麼?

+0

嗯,問題太籠統了。發佈一些代碼,你會得到更好的答案。 –

+0

's/static // g''' – Dani

+0

這是_waaaaaay_太寬而無法有效回答。暫時忘記一些一般的構造要應用或刪除(爲了論證的緣故,我假定你已經知道),但其他的一切都純粹與你的場景(或一組場景)有關。即你需要的不僅僅是一種使得這個類不是靜態的方式,你需要確保它是線程安全的:這不僅僅是一個實例類的結果。 –

回答

2

我已將數據層從靜態升級到無靜態類。所以

1:去除類和方法「靜態」關鍵字

第二:添加您的舊靜態類辛格爾頓以及

public class Foo 
{ 

    #region Singleton 

    Foo() 
    { 
    } 

    public static Foo Instance 
    { 
     get 
     { 
      return Nested.instance; 
     } 
    } 

    class Nested 
    { 
     static Nested() { } 

     internal static readonly Foo instance = new Foo(); 
    } 

    #endregion 

第三步:在每次調用您的類的富更換.Instance.DoSomething(),而不是Foo.DoSomething()

4:編譯和利潤

+0

第四步巖! – D3vtr0n

2

爲了讓它編譯?從所有成員中刪除static應該這樣做。

如果你想要更多的Kosher,那麼你應該從所有的調用中採取共同的參數,並將它們移動到構造函數中。

對我來說似乎很簡單。你有什麼特別的問題嗎?

2

我想你的意思是,因爲這是如此大的它類想象一下如何去做它並不容易,所以你想要遵循一些步驟。這裏所說:

  1. 轉換爲辛格爾頓
  2. 你需要糾正引用靜態類的地方,通過與單吸MyClass.instance()更換每學期 MyClass。保留所有這些地方的清單,以便您可以輕鬆地重新訪問它們。
  3. 在您找到的所有地方,找出如何最好地依賴注入MyClass.instance(),而不是使用MyClass來全局引用它。
  4. 將您的班級單獨化爲規範班級。你完成的DI工作應該可以很容易地從singleton getter切換到正常的構造函數。
  5. 現在開始一次使用多個實例,並修復由此導致的高級併發問題。

在每個步驟之間運行測試框架。

相關問題