2012-10-18 119 views
0

我們有一個類IoC<TContainer>其中TContainer是一個包裝我們在包含該類的模塊中使用的任何IoC容器的類。它的實現是這樣的:初始化繼承的靜態屬性

public class IoC<TContainer> 
    where TContainer : IServiceLocator 
{ 
    public static TContainer Container { get; set; } 

    public static T Resolve<T>() 
    { 
     return Container.Resolve<T>(); 
    } 
    public static object Resolve(Type type) 
    { 
     return Container.Resolve(type); 
    } 
    public static IEnumerable<T> ResolveAll<T>() 
    { 
     return Container.ResolveAll<T>(); 
    } 
    public static IEnumerable ResolveAll(Type type) 
    { 
     return Container.ResolveAll(type); 
    } 
} 

目前,某個地方,這需要進行初始化這樣

IoC<StructureMapServiceLocator>.Container = ... 

爲了簡化使用,我想這樣定義一個類:

public class SMIoC : IoC<StructureMapServiceLocator> 
{ 
    private SMIoC() 
    {} 

    static SMIoC() 
    { 
     Container = ... // Initialization 
    } 
} 

但是,這不起作用(Earlier question),有人認爲這是一個糟糕的設計。我怎麼能自動化初始化(使用靜態構造函數或其他方法)或其他一些技巧?

回答

0

通常我做的過程中應用程序或服務intialization應用:

  • ASP.NET。 Global.asax Application_Start事件或自定義HTTP模塊。
  • Web API。與ASP.NET相同。
  • Windows窗體/ WPF/Silverlight中...... Main()
  • ...

我不會依賴一個靜態構造函數。如果你需要確保你的容器被分配給任何請求或線程,我更喜歡我上面解釋的,因爲每個平臺都提供了一個方法覆蓋,事件或者在框架初始化期間執行的任何東西(這是一個單線程將在實例化容器並將其設置爲靜態屬性的時刻,而其他線程將被阻塞,直到初始化結束)

最後,有沒有通用的,與平臺無關的安全反轉控制容器的設置爲靜態屬性的方式。爲了確保事情做得對,請提示! :)