Aggiunta di servizi dopo la creazione del contenitore


89

È possibile registrare un servizio in fase di esecuzione, ovvero dopo che ContainerBuilderè stato costruito e Containercreato (e ContainerBuildersmaltito)?


Attualmente, le migliori pratiche dicono che i contenitori AutoFac sono immutabili
Ady

Risposte:


96

Sì, puoi, utilizzando il Updatemetodo su ContainerBuilder:

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

newBuilder.Update(existingContainer);

2
Tieni presente che l'aggiornamento di un contenitore esistente che è già stato utilizzato per la risoluzione può comportare un comportamento indeterministico. Ad esempio, la sostituzione di componenti che sono dipendenze di singleton già risolti fa sì che il componente originale rimanga referenziato.
Steven

13
L'aggiornamento è stato deprecato github.com/autofac/Autofac/issues/811 .
Chase Florell

20

Poiché ContainerBuilder.Update è stato deprecato, la nuova raccomandazione è di utilizzare l'ambito della durata del figlio.

Aggiunta di registrazioni a un ambito a vita

Autofac ti consente di aggiungere registrazioni "al volo" mentre crei ambiti a vita. Questo può aiutarti quando devi eseguire una sorta di override della registrazione limitata "saldatura a punti" o se in genere hai solo bisogno di alcune cose aggiuntive in un ambito che non vuoi registrare a livello globale. Puoi farlo passando un lambda a BeginLifetimeScope () che accetta un ContainerBuilder e aggiunge le registrazioni.

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

Lavorare con Lifetime Scopes


La cosa da notare è quel commento nel blocco using. "Le registrazioni aggiuntive saranno disponibili solo in questo ambito di vita."
Ady
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.