77 votes

Autofac: Résoudre toutes les instances d'un type

Compte tenu des inscriptions suivantes

 builder.Register<A>().As<I>();
builder.Register<B>().As<I>();
builder.Register<C>().As<I>();

var container = builder.Build();
 

Je cherche à résoudre toutes les instances de type I en tant que IEnumerable (un tableau ou une collection, cela n'a pas d'importance).

À Windsor, j'aurais écrit ce qui suit.

 foreach(I i in container.ResolveAll<I>())
{
 ...
}
 

Je migre de Windsor vers Autofac 1.4.4.561 mais je ne vois pas la syntaxe équivalente.

99voto

Philip Rieck Points 21405

Pour les versions actuelles de Autofac: ( 2.0+, donc tout ce que vous devriez être en utilisant d'aujourd'hui)

Vous enregistrez plusieurs ILoggers (par exemple):

var builder = new ContainerBuilder();

builder.Register<ConsoleLogger>()
  .As<ILogger>();

builder.Register<EmailLogger>()
  .As<ILogger>()
  .PreserveExistingDefaults(); //keeps console logger as the default

Puis d'obtenir tous ILoggers:

var loggers = container.Resolve<IEnumerable<ILogger>>();

Vous n'avez pas besoin de faire quelque chose de spécial, il suffit de demander pour un IEnumerable<T> du type désiré. Autofac a de soutien à la collecte de la boîte de, de concert avec d'autres cartes qui peuvent envelopper vos composants avec des fonctionnalités supplémentaires.

C'est le même usage que le pré-2.x ImplicitCollectionSupportModule, mais cuit au four droit.

Pour les anciennes versions (0.X - 1.4)

De deux façons:

1) Utiliser la collection de l'enregistrement

var builder = new ContainerBuilder();
builder.RegisterCollection<ILogger>()
  .As<IEnumerable<ILogger>>();

builder.Register<ConsoleLogger>()
  .As<ILogger>()
  .MemberOf<IEnumerable<ILogger>>();

builder.Register<EmailLogger>()
  .As<ILogger>()
  .MemberOf<IEnumerable<ILogger>>();

Alors:

var loggers = container.Resolve<IEnumerable<ILogger>>();

ce qui vous donne un IEnumerable.

ou 2) Vous pouvez utiliser le ImplicitCollectionSupport module, ce qui va rendre le code du travail comme des versions plus récentes de Autofac:

builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register(component1).As<ILogger>;
builder.Register(component2).As<ILogger>;

Puis résoudre une collection de ILogger plutôt que sur la recherche pour la résolution de tous.

var loggers = container.Resolve<IEnumerable<ILogger>>();

ce qui vous donne un IEnumerable, encore une fois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X