Autofac: Résoudre toutes les instances d'un type
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.
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.