从一个容器到另一个容器的Autofac复制注册

时间:2015-01-16 09:03:35

标签: c# unit-testing mstest autofac

我们正在尝试通过为TestBaseClass中的所有测试创建通用初始化来提高单元测试的性能。到目前为止,我们能够在某种程度上解决它。我们所有的测试类都直接从容器中解析(我认为从lifetimescope解决这个问题更好,但对于这样的改变来说可能为时已晚)。性能问题是在每次测试中我们都可以使用builder.Update(C)覆盖一些注册。 (C是容器)。所以我们每次都在进行autofac初始化,特别是这一行:

IContainer C = builder.Build();

需要花费很多时间。我的(显而易见的)解决方案是执行此操作,然后创建IContainer child并执行

child = C ;

并从孩子那里解决。可悲的是,当我这样做的时候他们共享注册,所以我想知道是否有办法解决这个问题而没有范围。

由于

彼得

1 个答案:

答案 0 :(得分:1)

真的没办法复制注册"从一个容器到另一个容器。

你是对的 - 如果你可以从生命周期范围而不是容器中切换要解决的问题,那就更好了。我不会想象它很难做到 - 只要容器被属性或其他东西访问,听起来你有一个基类,你可以切换属性返回{{1而不是ILifetimeScope,如果你只做决议,它就不应该破坏。

但是,如果您需要共享注册(无论出于何种原因),支持的机制是package them into Autofac modules。这可以让你做这样的事情:

IContainer

当您设置容器而不是复制东西时,请使用该模块注册常用内容。

public class CommonRegistrations : Module
{
  protected override void Load(ContainerBuilder builder)
  {
    // Put your common registrations here.
    builder.RegisterType<Common>().As<ICommon>();
  }
}

当然,如果容器的构建是给你带来麻烦的,那么模块方法不会让你省钱。唯一能够切换到使用生命周期范围的东西。