在构建容器之后添加服务

Pau*_*opf 80 ioc-container autofac

是否可以在运行时注册服务,这意味着在ContainerBuilder构建并Container创建(并ContainerBuilder处置)之后?

Pet*_*old 95

是的,您可以使用以下Update方法ContainerBuilder:

var newBuilder = new ContainerBuilder();
newBuilder.Register...;

newBuilder.Update(existingContainer);
Run Code Online (Sandbox Code Playgroud)

  • 更新已被弃用https://github.com/autofac/Autofac/issues/811. (9认同)
  • 请注意,更新已用于解析的现有容器可能会导致不确定的行为。例如,替换已经解析的单例依赖的组件会导致原始组件保持被引用。 (2认同)
  • 是的,它已经过时了,我来这里是为了寻找替代选项 (2认同)

wez*_*zix 7

由于不推荐使用ContainerBuilder.Update,因此新建议使用子生存期范围.

将注册添加到终身范围

Autofac允许您在创建生命周期范围时"动态"添加注册.当您需要执行某种"点焊"限制注册覆盖时,或者如果您通常只需要一些您不想在全局注册的范围内的其他内容时,这可以帮助您.您可以通过将lambda传递给BeginLifetimeScope()来实现此目的,该BeginLifetimeScope()接受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.
}
Run Code Online (Sandbox Code Playgroud)

使用终身范围

  • 需要注意的是 using 块中的注释。“额外的注册仅在此生命周期内可用。” (2认同)