复制(克隆)autofac注册

时间:2015-10-27 11:23:46

标签: testing autofac

在测试项目中,当我使用Autofac最新版本时,我发现性能差距。我有BaseTest类,它是所有测试的基类。在ctor我创建Autofac ContainerBuilder对象,注册所有类型等。

然后 - 构建容器并将其用于Service Locator。

问题是 - 我无法使容器静态并只初始化一个(每次测试不是一次),以节省大量时间扫描组件以注册类型等。

我的目标 - 创建静态ContainerBuilder(或Container) - 在静态ctor BaseTest中我将注册所有类型,然后在通常的ctor中将此实例(所有注册)复制到非静态属性并将其用于ServiceLocator。

为什么我需要它 - 因为,例如TestA更改/添加替换或者因此TestB确实知道有关该替换的任何信息。所以我需要在每个测试集之后清理所有关于注册的定制。

您对如何做有任何想法吗?我在autofac中搜索了很多信息 - 因为我知道无法复制或克隆容器。另外,我无法使ContainerBuilder静态,并且在通常的ctor中调用Build()或Update,因为它是不允许的。

提前致谢。

1 个答案:

答案 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.
  }
}