2010-09-11 29 views
0

我是新結構圖,迄今爲止運氣不錯。但是,我遇到了一個問題。這是嘗試使用命名實例和更新的.For()。使用()語法自動連接。在結構圖中使用命名實例自動連接時出現問題

無論我做什麼,我都會收到我爲給定類型配置的最後一個項目,當我嘗試自動連線以創建新對象時。當我只是試圖從容器中獲取該類型時,我可以使用命名實例獲得正確的項目而不會出現問題。

爲簡單起見,下面顯示的是ObjectFactory,但是我的真實代碼使用的是IContainer。兩者對我來說都有同樣的結果。

//arrange 
    var expectedGreen = "Green"; 
    var notExpectedBlue = "Blue"; 
    var greenInstance = new Mock<ITestClass>(); 
    greenInstance.SetupGet(m => m.Data).Returns(expectedGreen); 
    ObjectFactory.Configure(x => x.For<ITestClass>().Use(greenInstance.Object).Named("Green")); 

    var blueInstance = new Mock<ITestClass>(); 
    blueInstance.SetupGet(m => m.Data).Returns(notExpectedBlue); 
    ObjectFactory.Configure(x => x.For<ITestClass>().Use(blueInstance.Object).Named("Blue")); 

//act 
    var actual = ObjectFactory.GetNamedInstance<TestTarget>("Green"); 

//assert 
    Assert.AreEqual(expectedGreen, actual.TestClass.Data); 

TestTarget類具有一個構造函數,它將ITestClass作爲參數。我的期望是,通過詢問TestTarget的一個實例,我會得到一個構建的TestTarget,它將引用名爲「Green」的ITestClass。

最終,我的目標是模擬一個案例,我有兩個相同類型的對象,這些對象將在容器中訪問(例如可以使用兩個數據庫的應用程序)。解決這類問題的另一種方法也是一個很好的答案。但是,我想堅持使用2.5+以上的方法。

回答

0

原來我需要用「With」來做我正在做的事。這最終是一個兩步過程,但是完成了我想要的。

var greenFromContainer = ObjectFactory.GetNamedInstance<ITestClass>("Green"); 
var actual = ObjectFactory.With(greenFromContainer).GetInstance<TestTarget>(); 

更復雜的情況似乎與單獨的容器/登記或利用擴展構造規則最好的處理。

2

當您指定多個實例時,請使用Add()而不是Use()Use()是舊的TheDefaultIs()的同義詞。

ObjectFactory.Configure(x => x.For<ITestClass>().Add(blueInstance.Object) 
    .Named("Blue")); 
相關問題