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)?


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);

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.