Wil*_*ill 7 structuremap asp.net-mvc asp.net-mvc-3 simple-injector
我正在ASP.NET MVC3应用程序中从StructureMap迁移到Simple Injector.
我正在使用控制器DI的MVC3扩展,但我遇到了尝试替换StructureMap的静态方面的问题.我们有电话
StructureMap.ObjectFactory.GetInstance<Interface>()
Run Code Online (Sandbox Code Playgroud)
在应用程序的不同层.它看起来不像Simple Injector有办法做到这一点.
我错过了什么吗?或者Simple Injector不适用于我的应用程序?
请提前告知并提前致谢.
Ste*_*ven 14
允许应用程序直接访问容器被认为是不好的做法.它是Service Locator模式的一种形式,被认为是反模式:
简而言之,Service Locator的问题在于它隐藏了一个类的依赖项,导致运行时错误而不是编译时错误,以及使代码更难以维护,因为它不清楚何时引入一个破坏更改.
因为这被认为是一件坏事,Simple Injector不包含任何类似StructureMap的东西ObjectFactory.GetInstance
.而作为事实上,StructureMap的作者正在考虑移除了的ObjectFactory
在StructureMap的furure发布API.
但是,没有什么能阻止您将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 void GetInstance<T>() where T : class
{
return container.GetInstance<T>();
}
}
Run Code Online (Sandbox Code Playgroud)
在Composition根目录中:
public static void Initialize()
{
var container = new Container();
InitializeContainer(container);
DependencyResolver.SetResolver(
new SimpleInjectorDependencyResolver(container));
// Set the service locator here
ObjectFactory.SetContainer(container);
}
Run Code Online (Sandbox Code Playgroud)
因此,Simple Injector没有任何限制阻止您这样做,但坦率地说,您已经见证了Service Locator是一件坏事的原因之一:您切换容器,现在您必须更改应用程序代码.
也许现在最简单的方法是将容器保存在静态字段中(如上例所示),但请花些时间来理解为什么这个模式是坏的,并且重构从这种模式转向依赖注入(和特别是构造函数注入).
祝好运.