2017-05-25 78 views
0

在簡單噴油器中是否有任何方法可以在運行時將一種類型的默認值替換爲結構圖中的containter.Inject()?我借用code用結構圖如下簡單噴油器:在運行時替換註冊類型

var container = new Container(x => { x.For<IFoo>().Use<AFoo>(); }); 
container.GetInstance<IFoo>().ShouldBeOfType<AFoo>(); 
container.Configure(x => x.For<IFoo>().Use<BFoo>()); 

// The default of IFoo is now different 
container.GetInstance<IFoo>().ShouldBeOfType<BFoo>(); 

// or use the Inject method that's just syntactical 
// sugar for replacing the default of one type at a time 
container.Inject<IFoo>(new CFoo()); 

container.GetInstance<IFoo>().ShouldBeOfType<CFoo>(); 

我的背景下

註冊容器

// bypass verify was removed for short 
_container.Register<HttpContextBase>(() => new HttpContextWrapper(HttpContext.Current)); 
_container.Register(() => _container.GetInstance<HttpContextBase>().User.Identity); 

我的服務

public class MyService : IMyService 
{ 
    public MyService(IIdentity identity) 
    { 
     //... 
    } 
    //... 
} 

沒有與我的應用程序沒有問題。有效。但在我的單元測試(真正的本地數據庫沒有模擬),我想用登錄用戶替換IIdentity。我用結構圖,它的工作。現在我不知道如何使它適用於Simple Injector。

+0

爲什麼你想在運行時替換一個實例? – Steven

+0

OP我想你還讀過代碼段下面的段落? 「首先,關於此功能的最佳建議是*不要在根容器*上的測試場景之外使用它。」 – trashr0x

+0

@Steven我用當前的上下文更新了我的問題 – Martinez

回答

0

但在我的單元測試(真正的本地數據庫沒有模擬),我想用登錄用戶替換IIdentity。

你可以完全替代真正的IIdentity註冊與一個不同的單元測試。您只需在從容器中解析之前執行此操作

這意味着每整合測試(我說的「整合」,因爲一個單元測試應該使用DI容器)應該得到自己的Container實例。其次,爲了能夠覆蓋現有的註冊,您必須設置container.Options.AllowOverridingRegistrations。欲瞭解更多信息,請閱讀this

+0

感謝您的回答。這實際上是集成測試。在問這個問題之前,我想過這個解決方案。我只是想找到另一個更清潔的解決方案,而不碰非常容器。 – Martinez

相關問題