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.

War es hilfreich?

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 ILoggers 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top