我们有一个类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 :(得分:0)
通常我在应用程序或服务初始化期间在应用程序中执行此操作:
Application_Start
事件或自定义HTTP模块。Main()
我不会依赖静态构造函数。如果您需要确保为任何请求或线程分配了容器,我更喜欢上面解释的内容,因为每个平台都提供了一个方法覆盖,事件或在框架初始化期间执行的任何内容(这是单个线程将工作在实例化容器并将其设置为某个静态属性时,其他线程将被阻塞,直到初始化结束)。
最后,没有通用的,与平台无关的安全方法将反转控件容器设置为静态属性。为了确保事情做得好,请接受提示! :)