Question

Étant donné les 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 (tableau ou 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.

Était-ce utile?

La solution

Pour les versions actuelles d'Autofac: (2.0+, tout ce que vous devriez utiliser 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

Ensuite, obtenez tous les ILogger s:

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

Vous n'avez rien de spécial à faire, il vous suffit de demander un IEnumerable<T> type. Autofac prend immédiatement en charge la collecte, ainsi que d'autres adaptateurs . qui peut envelopper vos composants avec des fonctionnalités supplémentaires.

C’est la même utilisation que le module ImplicitCollectionSupportModule antérieur à la version 2.x, mais cuit directement.

Pour les anciennes versions (0.X - 1.4)

Deux façons:

1) Utilisez l'enregistrement de la collection

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

Ensuite:

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

qui vous donne un IEnumerable.

ou 2) Vous pouvez utiliser le module ImplicitCollectionSupport, qui fera fonctionner le code comme une version plus récente d’Autofac:

<*>

Ensuite, résolvez une collection d'ILogger plutôt que de chercher à résoudre tous les problèmes.

<*>

qui vous donne à nouveau un IEnumerable.

Autres conseils

Une mise à jour pour la nouvelle version (2.x). Tout ce dont vous avez besoin maintenant est:

container.Resolve<IEnumerable<I>>();

Plus besoin de RegisterCollection() ou ImplicitCollectionSupportModule, cette fonctionnalité est prête à l'emploi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top