2013-12-10 53 views
2

我有一個實現Singleton設計模式的類。但是,每當我嘗試獲取該類的實例時,使用Activator.CreateInstance(MySingletonType)只調用私有構造函數。有沒有辦法調用除私有構造函數之外的其他方法?Singleton with Activator.CreateInstance

我的類定義如下:

public class MySingletonClass{ 


    private static volatile MySingletonClassinstance; 
    private static object syncRoot = new object(); 
    private MySingletonClass() 
      { 
       //activator.createInstance() comes here each intantiation. 
      } 

    public static MySingletonClassInstance 
     { 
       get 
       { 
        if (instance == null) 
        { 
         lock (syncRoot) 
         { 
          if (instance == null) 
           instance = new MySingletonClass(); 
         } 
        } 
        return instance; 
       } 
      } 
} 

而且實例如下:

Type assemblyType = Type.GetType(realType + ", " + assemblyName); 
IService service = Activator.CreateInstance(assemblyType, true) as IService; 
+1

爲什麼你想在這裏使用激活?它看起來像你只是想使用靜態屬性。 – vcsjones

+0

我正在使用獨特的服務加載程序以動態方式加載一組服務。 – guanabara

回答

3

Activator.CreateInstance,除了一個極端邊緣的情況下,總是會創建一個新的實例。我建議你可能不想在這裏使用Activator

但是,如果您別無選擇,hacky hack hack hack將創建一個繼承自ContextBoundObject的類,並使用ProxyAttribute的自定義子類對其進行修飾。在自定義ProxyAttribute子類中,覆蓋CreateInstance可以做任何你想做的事情。這是各種各樣的邪惡。但它甚至適用於new Foo()

+0

感謝您的回覆。你說話時那種極端的情況是什麼? – guanabara

+1

@guanabara這將是第二段,涉及'ContextBoundObject'和'ProxyAttribute',它完全顛覆如何創建對象,並且可以用於每次返回同一對象(來自'CreateInstance') –

0

嘿,我不知道你爲什麼用反射創建單例類的對象。

單例類的基本目的是它只有一個對象並具有全局訪問權限。

但是你可以訪問任何你的方法在單例類,如:

public class MySingletonClass { 
    private static volatile MySingletonClass instance; 
    private static object syncRoot = new object(); 
    private MySingletonClass() { } 

    public static MySingletonClass MySingletonClassInstance { 
     get { 
       if (instance == null) { 
        lock (syncRoot) { 
         if (instance == null) 
          instance = new MySingletonClass(); 
        } 
       } 
      return instance; 
     } 
    } 

    public void CallMySingleTonClassMethod() { } 
} 

public class program { 
    static void Main() { 
     //calling a 
     methodMySingletonClass.MySingletonClassInstance 
           .CallMySingleTonClassMethod();  

    } 
}