Ajout de services après la création du conteneur


87

Est-il possible d'enregistrer un service au moment de l'exécution, c'est-à-dire après que le ContainerBuildera été construit et que le Containera été créé (et ContainerBuildersupprimé)?


À l' heure actuelle, les meilleures pratiques disent conteneurs AutoFac sont immuables
Ady

Réponses:


96

Oui, vous pouvez, en utilisant la Updateméthode sur ContainerBuilder:

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

newBuilder.Update(existingContainer);

2
Notez que la mise à jour d'un conteneur existant qui a déjà été utilisé pour la résolution peut entraîner un comportement indéterministe. Par exemple, le remplacement de composants qui sont des dépendances de singletons déjà résolus permet au composant d'origine de rester référencé.
Steven

13
La mise à jour est obsolète github.com/autofac/Autofac/issues/811 .
Chase Florell

19

Étant donné que ContainerBuilder.Update est obsolète, la nouvelle recommandation consiste à utiliser l'étendue de la durée de vie des enfants.

Ajout d'enregistrements à une étendue à vie

Autofac vous permet d'ajouter des enregistrements «à la volée» lorsque vous créez des portées à vie. Cela peut vous aider lorsque vous avez besoin de faire une sorte de remplacement d'enregistrement limité par «soudage par points» ou si vous avez généralement besoin de quelques éléments supplémentaires dans une portée que vous ne souhaitez pas enregistrer globalement. Pour ce faire, passez un lambda à BeginLifetimeScope () qui prend un ContainerBuilder et ajoute des inscriptions.

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

Utilisation des étendues à vie


La chose à noter est ce commentaire dans le bloc using. "Les enregistrements supplémentaires ne seront disponibles que dans cette étendue à vie."
Ady le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.