允许应用程序直接访问容器被认为是不好的做法。它是Service Locator 反模式的一种形式。
因为这被认为是一件坏事,所以 Simple Injector 不包含任何类似 StructureMap 的东西ObjectFactory.GetInstance
。事实上,StructureMap 的作者正在考虑在 StructureMap 的未来版本中删除API ObjectFactory
。
但是,没有什么能阻止您将SimpleInjector.Container
实例存储在静态字段中并让应用程序使用它:
// Service Locator implementation in low application layer.
public static class ObjectFactory
{
private static SimpleInjector.Container container;
public static void SetContainer(Container container)
{
ObjectFactory.container = container;
}
public static T GetInstance<T>() where T : class
{
return container.GetInstance<T>();
}
}
在组合根中:
public static void Initialize()
{
var container = new Container();
InitializeContainer(container);
DependencyResolver.SetResolver(
new SimpleInjectorDependencyResolver(container));
// Set the service locator here
ObjectFactory.SetContainer(container);
}
因此,Simple Injector 并没有阻止您这样做的限制,但坦率地说,您已经见证了 Service Locator 是一件坏事的原因之一:您切换了容器,现在您必须更改应用程序代码。
也许现在最简单的方法是将容器保存在静态字段中(如上例所示),但请花时间理解为什么这种模式不好,并从这种模式重构为依赖注入(以及特别是构造函数注入)。