由于历史原因,我们的应用程序只有一个静态StructureMap Container
,它可用于所有IoC / DI。我们有相当多的测试来检查这个容器是否正确设置,但是确保测试不会相互干扰变得越来越困难。我想开始分解几个(非静态)容器来缓解这个问题。要保持向后兼容性,此容器中配置的内容仍必须从主容器中可用。
我已经为系统的一小部分实现了概念验证,这种方式只处理几种基本类型:
_pocContainer = new Container(/* setup code */);
MainContainer.Configure(c => c.For<C>.Use(ctx => _pocContainer.GetInstance<C>());
这样做,并且当从静态容器请求C
的实例时,它从_pocContainer
解析。但是,我很确定这不是设计StructureMap时被认为是正常用例的东西。这会导致性能不佳,还是会产生其他负面影响?有没有更好的方法来做到这一点?
答案 0 :(得分: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();
});
});