在测试项目中,当我使用Autofac最新版本时,我发现性能差距。我有BaseTest类,它是所有测试的基类。在ctor我创建Autofac ContainerBuilder对象,注册所有类型等。
然后 - 构建容器并将其用于Service Locator。
问题是 - 我无法使容器静态并只初始化一个(每次测试不是一次),以节省大量时间扫描组件以注册类型等。
我的目标 - 创建静态ContainerBuilder(或Container) - 在静态ctor BaseTest中我将注册所有类型,然后在通常的ctor中将此实例(所有注册)复制到非静态属性并将其用于ServiceLocator。
为什么我需要它 - 因为,例如TestA更改/添加替换或者因此TestB确实知道有关该替换的任何信息。所以我需要在每个测试集之后清理所有关于注册的定制。
您对如何做有任何想法吗?我在autofac中搜索了很多信息 - 因为我知道无法复制或克隆容器。另外,我无法使ContainerBuilder静态,并且在通常的ctor中调用Build()或Update,因为它是不允许的。
提前致谢。
答案 0 :(得分:2)
Autofac不支持克隆容器或容器注册。
不是在每个测试中更改整个容器,而是使用嵌套的生命周期范围。在您的测试夹具设置中,注册所有不会发生变化的所有测试共有的东西 然后在每个测试中,创建一个新的生命周期范围并注册差异/覆盖。
private IContainer _container;
[TestFixtureSetUp]
public void TestFixtureSetUp()
{
var builder = new ContainerBuilder();
// Register the common stuff, then
this._container = builder.Build();
}
[Test]
public void SomeTest()
{
using(var scope = this._container.BeginLifetimeScope(
b => b.RegisterType<OverrideType>().As<IOverride>())
{
// Resolve things from the "scope" variable rather
// than from the root container.
}
}