Autofac: Lösen Sie alle Instanzen eines Typs
Frage
die folgenden Registrierungen Gegeben
builder.Register<A>().As<I>();
builder.Register<B>().As<I>();
builder.Register<C>().As<I>();
var container = builder.Build();
Ich bin auf der Suche alle Instanzen des Typs I als IEnumerable
(Array oder Sammlung es keine Rolle spielt) zu lösen.
In Windsor würde ich folgendes geschrieben haben.
foreach(I i in container.ResolveAll<I>())
{
...
}
ich von Windsor nach Autofac 1.4.4.561 bin Migration kann aber nicht die entsprechende Syntax sehen.
Lösung
Für aktuelle versons von Autofac: (2.0+, so etwas sollten Sie heute verwenden)
Sie registrieren mehrere ILoggers
(zum Beispiel):
var builder = new ContainerBuilder();
builder.Register<ConsoleLogger>()
.As<ILogger>();
builder.Register<EmailLogger>()
.As<ILogger>()
.PreserveExistingDefaults(); //keeps console logger as the default
Dann all ILogger
s erhalten:
var loggers = container.Resolve<IEnumerable<ILogger>>();
Sie müssen nichts Besonderes tun, fragen Sie einfach für einen IEnumerable<T>
des gewünschten Typs. Autofac hat Sammlung Unterstützung aus dem Kasten heraus, zusammen mit anderem Adapter dass Ihre Komponenten mit zusätzlicher Funktionalität wickeln.
Dies ist die gleiche Nutzung wie die Pre-2.x ImplicitCollectionSupportModule, aber gebacken direkt.
Für ältere Versionen (0.X - 1.4)
Zwei Möglichkeiten:
1) Verwenden Sie die Sammlung Registrierung
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>>();
Dann:
var loggers = container.Resolve<IEnumerable<ILogger>>();
das gibt Ihnen ein IEnumerable.
oder 2) Sie können die ImplicitCollectionSupport Modul verwenden, die den Code arbeiten wie neuere Versionen von Autofac machen:
builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register(component1).As<ILogger>;
builder.Register(component2).As<ILogger>;
Dann eine Sammlung von ILogger lösen, anstatt alle auf der Suche nach der Lösung.
var loggers = container.Resolve<IEnumerable<ILogger>>();
das gibt Ihnen einen IEnumerable, wieder.
Andere Tipps
Ein Update zum Wohl der neuen (2.x) Version. Alles, was Sie jetzt brauchen, ist:
container.Resolve<IEnumerable<I>>();
Es gibt keine Notwendigkeit mehr für RegisterCollection()
oder ImplicitCollectionSupportModule
-. Diese Funktionalität aus der Box kommt