-1

由于历史原因,我们的应用程序有一个静态 StructureMap Container,它用于所有地方的所有 IoC/DI。我们有很多测试来检查这个容器是否正确设置,但是确保测试不会相互干扰变得越来越困难。我想开始使用几个(非静态)容器来缓解这种情况。为了保持向后兼容性,在这个容器中配置的东西必须在主容器中仍然可用。

我已经为系统的一小部分实现了概念验证,它以这种方式只处理少数基本类型:

_pocContainer = new Container(/* setup code */);
MainContainer.Configure(c => c.For<C>.Use(ctx => _pocContainer.GetInstance<C>());

这是可行的,当从静态容器请求一个实例时C,它是从_pocContainer. 但是,我相当肯定这不是设计 StructureMap 时被视为正常用例的东西。这会导致性能不佳,还是有任何其他负面后果?有没有更好的方法来做到这一点?

4

1 回答 1

1

一种可能的方法是将注册分成Registries并分别测试每个注册表。

public class FooRegistry : Registry {
    public FooRegistry() {
        For<IFoo>().Use<Foo>();
    }
}

然后,您可以在测试中显式使用注册表

var container = new Container(new FooRegistry());

但是让所有注册表自动扫描到您的合成根目录中

var container = new Container(x => {
    x.Scan(scanner =>
    {
        scanner.TheCallingAssembly()
       scanner.LookForRegistries();
    });
});
于 2013-08-26T08:09:35.147 回答