我正在ASP.NET MVC3应用程序中从StructureMap迁移到Simple Injector.
@H_301_2@我正在使用控制器DI的MVC3扩展,但我遇到了尝试替换StructureMap的静态方面的问题.我们有电话
StructureMap.ObjectFactory.GetInstance<Interface>()@H_301_2@在应用程序的不同层.它看起来不像Simple Injector有办法做到这一点. @H_301_2@我错过了什么吗?或者Simple Injector不适用于我的应用程序? @H_301_2@请提前通知并表示感谢.
解决方法
允许应用程序直接访问容器被认为是不好的做法.它是
Service Locator pattern的一种形式,被认为是
anti-pattern:
@H_301_2@In short,the problem with Service Locator is that it hides a class’@H_301_2@因为这被认为是一件坏事,Simple Injector不包含任何类似StructureMap的ObjectFactory.GetInstance.事实上,ObjectFactory API的StructureMap is considering the removal的作者在一个版本发布的StructureMap中. @H_301_2@但是,没有什么能阻止您将SimpleInjector.Container实例存储在静态字段中,并让应用程序使用它:
dependencies,causing run-time errors instead of compile-time errors,
as well as making the code more difficult to maintain because it
becomes unclear when you would be introducing a breaking change.
// 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>(); } }@H_301_2@在Composition根目录中:
public static void Initialize() { var container = new Container(); InitializeContainer(container); DependencyResolver.SetResolver( new SimpleInjectorDependencyResolver(container)); // Set the service locator here ObjectFactory.SetContainer(container); }@H_301_2@因此,Simple Injector没有任何限制可以阻止你这样做,但坦率地说,你已经看到了Service Locator是一件坏事的原因之一:你切换了容器,现在你必须更改应用程序代码. @H_301_2@也许现在最简单的方法是将容器保存在静态字段中(如上例所示),但是请花时间理解为什么这种模式不好,并且重构从这种模式转向依赖注入(和特别是构造函数注入). @H_301_2@祝好运.