在结构图中使用命名实例自动连接时出现问题

时间:2010-09-11 03:41:27

标签: structuremap

我是结构地图的新手,到目前为止还有好运。但是,有一个方面我遇到了一些问题。这是尝试使用命名实例和更新的.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+方法来做到这一点。

2 个答案:

答案 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>();

使用单独的容器/注册表或利用扩展的构造函数规则,似乎最好处理更复杂的场景。