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 ILogger
s:
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.