我是结构地图的新手,到目前为止还有好运。但是,有一个方面我遇到了一些问题。这是尝试使用命名实例和更新的.For()。Use()语法进行自动连接。
无论我做什么,当我尝试自动连线以创建新对象时,我正在获取我为给定类型配置的最后一项。当我只是试图从容器中获取该类型时,我可以使用命名实例获得正确的项目而没有问题。
为简单起见,下面显示了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 :(得分:2)
指定多个实例时,请使用Add()
代替Use()
。 Use()
是旧版TheDefaultIs()
的同义词。
ObjectFactory.Configure(x => x.For<ITestClass>().Add(blueInstance.Object)
.Named("Blue"));
答案 1 :(得分:0)
原来我需要使用“With”来做我想做的事情。这最终是一个两步过程,但完成了我想要的。
var greenFromContainer = ObjectFactory.GetNamedInstance<ITestClass>("Green");
var actual = ObjectFactory.With(greenFromContainer).GetInstance<TestTarget>();
使用单独的容器/注册表或利用扩展的构造函数规则,似乎最好处理更复杂的场景。