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
    }
}

但是,这不起作用(较早的问题),并且有人认为这是一个糟糕的设计。如何自动化初始化(使用静态构造函数或其他方法)或其他技巧?

4

1 回答 1

0

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

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

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

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

于 2012-10-18T13:36:17.170 回答