Asp.net-Mvc
哪裡是 Simple Injector 等效於 StructureMap 的 ObjectFactory
我正在從 StructureMap 遷移到 ASP.NET MVC3 應用程序中的 Simple Injector。
我正在為控制器 DI 使用 MVC3 擴展,但在嘗試替換 StructureMap 的靜態方面時遇到了問題。我們有電話
StructureMap.ObjectFactory.GetInstance<Interface>()貫穿應用程序的不同層。看起來 Simple Injector 沒有辦法做到這一點。
我錯過了什麼嗎?還是 Simple Injector 不適用於我的應用?
請提前告知和感謝。
允許應用程序直接訪問容器被認為是不好的做法。它是Service Locator 反模式的一種形式。
因為這被認為是一件壞事,所以 Simple Injector 不包含任何類似 StructureMap 的東西
ObjectFactory.GetInstance。事實上,StructureMap 的作者正在考慮在 StructureMap 的未來版本中刪除APIObjectFactory。但是,沒有什麼能阻止您將
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 是一件壞事的原因之一:您切換了容器,現在您必須更改應用程式碼。
也許現在最簡單的方法是將容器保存在靜態欄位中(如上例所示),但請花時間理解為什麼這種模式不好,並從這種模式重構為依賴注入(以及特別是建構子注入)。