2012-10-18 106 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()
  • ...

我不会依赖一个静态构造函数。如果你需要确保你的容器被分配给任何请求或线程,我更喜欢我上面解释的,因为每个平台都提供了一个方法覆盖,事件或者在框架初始化期间执行的任何东西(这是一个单线程将在实例化容器并将其设置为静态属性的时刻,而其他线程将被阻塞,直到初始化结束)

最后,有没有通用的,与平台无关的安全反转控制容器的设置为静态属性的方式。为了确保事情做得对,请提示! :)