代码之家  ›  专栏  ›  技术社区  ›  Jim L

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

  •  0
  • Jim L  · 技术社区  · 14 年前

    为了简单起见,下面显示的是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 回复  |  直到 14 年前
        1
  •  2
  •   Joshua Flanagan    14 年前

    指定多个实例时,请使用 Add() Use() . 是旧的同义词 TheDefaultIs() .

    ObjectFactory.Configure(x => x.For<ITestClass>().Add(blueInstance.Object)
        .Named("Blue"));
    
        2
  •  0
  •   Jim L    14 年前

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

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