Adicionar serviços após a construção do contêiner

87

É possível registrar um serviço em tempo de execução, ou seja, depois que o ContainerBuilderfoi construído e o Containerfoi criado (e ContainerBuildereliminado)?

Paul Knopf
fonte
Atualmente, as práticas recomendadas dizem que os contêineres AutoFac são imutáveis
Ady

Respostas:

96

Sim, você pode, usando o Updatemétodo em ContainerBuilder:

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

newBuilder.Update(existingContainer);
Peter Lillevold
fonte
2
Observe que atualizar um contêiner existente que já foi usado para resolver pode resultar em um comportamento indeterminista. Por exemplo, a substituição de componentes que são dependências de singletons já resolvidos faz com que o componente original permaneça referenciado.
Steven
13
A atualização está sendo descontinuada github.com/autofac/Autofac/issues/811 .
Chase Florell
19

Como ContainerBuilder.Update foi descontinuado, a nova recomendação é usar o escopo de vida útil do filho.

Adicionando registros a um escopo vitalício

O Autofac permite que você adicione registros “instantaneamente” à medida que você cria escopos vitalícios. Isso pode ajudá-lo quando você precisa fazer um tipo de cancelamento de registro limitado de “solda por pontos” ou se você geralmente só precisa de algumas coisas adicionais em um escopo que você não deseja registrar globalmente. Você faz isso passando um lambda para BeginLifetimeScope () que pega um ContainerBuilder e adiciona registros.

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

Trabalhando com Lifetime Scopes

wezzix
fonte
O que se deve notar é aquele comentário no bloco de uso. "Os registros adicionais estarão disponíveis apenas neste escopo vitalício."
Ady