初始化继承的静态属性

时间:2012-10-18 13:14:26

标签: c# inheritance

我们有一个类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),并且有人认为这是一个糟糕的设计。我怎样才能自动化初始化(使用静态构造函数或其他方法),或者其他一些技巧?

1 个答案:

答案 0 :(得分:0)

通常我在应用程序或服务初始化期间在应用程序中执行此操作:

  • ASP.NET 。 Global.asax Application_Start事件或自定义HTTP模块。
  • Web API 。与ASP.NET相同。
  • Windows窗体/ WPF / Silverlight ...... Main()
  • ...

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

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