Resolve-Abhängigkeit mit Autofac basierend auf Konstruktorparameter Attribut
-
21-09-2019 - |
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?
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 .