构建容器后添加服务

97

ContainerBuilder 构建完成并创建了 ContainerContainerBuilder 已处理)之后,是否可能在运行时注册服务?


目前最佳实践表明,AutoFac容器是不可变的。 - Ady
2个回答

98
可以的,使用ContainerBuilder上的Update方法即可:
var newBuilder = new ContainerBuilder();
newBuilder.Register...;

newBuilder.Update(existingContainer);

2
请注意,更新已经被用于解析的现有容器可能会导致不确定的行为。例如,替换已解析单例的依赖组件会导致原始组件保持引用。 - Steven
18
更新功能正在被废弃。请参考https://github.com/autofac/Autofac/issues/811。 - Chase Florell
2
是的,它已经过时了,我来这里寻找替代选项。 - Mohammed Dawood Ansari

30

由于ContainerBuilder.Update已经被弃用,新的建议是使用子生命周期范围。

向生命周期范围添加注册信息

Autofac允许您在创建生命周期范围时“即时”添加注册信息。当您需要进行一种“点焊”有限注册覆盖或者通常需要在范围中添加一些不想全局注册的附加内容时,这将非常有帮助。您可以通过向BeginLifetimeScope()传递一个lambda表达式来实现这一点,该表达式接受ContainerBuilder并添加注册信息。

using(var scope = container.BeginLifetimeScope(
  builder =>
  {
    builder.RegisterType<Override>().As<IService>();
    builder.RegisterModule<MyModule>();
  }))
{
  // The additional registrations will be available
  // only in this lifetime scope.
}

处理生命周期作用域


2
需要注意的是 using 块中的注释。“额外的注册仅在此生命周期范围内可用。” - Ady

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接