Frage

Ich verwende Autofac. Ich möchte eine andere Implementierung einer Abhängigkeit von einem Attribut I an den Konstruktor Parameter gelten Basis injizieren. Zum Beispiel:

class CustomerRepository
{
    public CustomerRepository([CustomerDB] IObjectContainer db) { ... }
}

class FooRepository
{
    public FooRepository([FooDB] IObjectContainer db) { ... }
}

builder.Register(c => /* return different instance based on attribute on the parameter */)
       .As<IObjectContainer>();

Die Attribute werden Daten, wie zum Beispiel eine Verbindungszeichenfolge zur Verfügung stellen, die ich beispielsweise das richtige Objekt verwenden können.

Wie kann ich das tun?

War es hilfreich?

Lösung

Es klingt wie Sie verschiedene Implementierungen von IObjectContainer zu CustomerRepository und FooRepository zur Verfügung stellen möchten. Wenn das der Fall ist, könnten Attribute sein ein dünnes Metall-Lineal . Stattdessen werde ich Ihnen zeigen, wie ich mehrere Implementierungen mit Autofac implementieren würde.

(Anrufe wie .ContainerScoped() gelassen wurden der Kürze halber aus.)

Als erstes eine Version von IObjectContainer für jede Verbindungszeichenfolge registrieren, indem Sie die Registrierungen zu benennen:

builder
    .Register(c => new ObjectContainer(ConnectionStrings.CustomerDB))
    .As<IObjectContainer>()
    .Named("CustomerObjectContainer");

builder
    .Register(c => new ObjectContainer(ConnectionStrings.FooDB))
    .As<IObjectContainer>()
    .Named("FooObjectContainer");

Dann löst die spezifischen Instanzen in den Repository-Registrierungen:

builder.Register(c => new CustomerRepository(
    c.Resolve<IObjectContainer>("CustomerObjectContainer"));

builder.Register(c => new FooRepository(
    c.Resolve<IObjectContainer>("FooObjectContainer"));

Dies läßt die Repositories von Konfigurationsinformationen freizugeben:

class CustomerRepository
{
    public CustomerRepository(IObjectContainer db) { ... }
}

class FooRepository
{
    public FooRepository(IObjectContainer db) { ... }
}

Andere Tipps

Bryans Antwort ist gut genug, während Sie mehrere Repositories haben, und sie haben nur wenige Konstruktorparameter. Aber es ist schwierig, Ihre Wurzel einzurichten, wenn Sie viele von ihnen haben. Sie können diese Metadaten durch das Scannen Ihrer Klasse erreichen eine Schnittstelle auf die Lösung. Wenn Sie Informationen über seine Parameter erhalten Sie konkrete Umsetzung es lösen. Siehe meine Antwort hier .

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