2016-04-27 16 views
1

Mit Autofac registriere ich 2 Implementierungen mit einem Typ. Und müssen die Implementierungen bei Bedarf austauschen. Aber es dauert immer eine Implementierung.Autofac - Verwendung mehrerer Implementierungen

public class DataAccesss 
{ 
    public IDatabaseHelper { get; set; } 
} 

Autofac

builder.RegisterType<DatabaseHelper>() 
     .Named<IDatabaseHelper>("Sql") 
     .WithParameter(new TypedParameter(IDatabaseHelper), new DatabaseHelper(new SqlFactory)) 
     .PropertiesAutowired(); 

builder.RegisterType<DatabaseHelper>() 
     .Named<IDatabaseHelper>("Oledb") 
     .WithParameter(new TypedParameter(IDatabaseHelper), new DatabaseHelper(new OleDbFactory)) 
     .PropertiesAutowired(); 

Und in der Steuerung benötigen, so etwas wie diese

1st - need to access `IDatabaseHelper` with `OleDb` 
2nd - need to access `IDatabaseHelper` with `Sql` 

haben, aber mein Problem ist IDatabaseHelper ist entweder null oder es wird immer OleDb und nicht Sql nehmen.

+0

Was meinst du mit * auf Anfrage *? unterschiedliche Implementierung für verschiedene Dienste? –

+0

mit dem gleichen Dienst muss ich auf beide 'OleDbClient' und 'SqlClient' zugreifen –

+0

Wenn Sie schreiben als, es wird immer OleDb, 1 Schnittstelle nur erhalten SqlFactory ODER OleDbFactory –

Antwort

2

Wenn Sie eine einzelne Komponente auflösen Autofac gibt die neueste registrierte Komponente zurück, die dem Vorgang entspricht.

Wenn Sie auf beide Dienste in Ihrer Implementierung zugreifen müssen, können Sie eine Abhängigkeit von IEnumerable<IDatabaseHelper> haben, die alle IDatabaseHelper registrierten Dienst auflösen wird.

Eine andere Lösung wäre, auf IIndex<TKey, TValue> verlassen und benannt Registrierung

public class XController 
{ 
    public XController(IIndex<String, IDatabaseHelper> databaseHelpers) 
    { 
     this._databaseHelpers = databaseHelpers; 
    } 

    private readonly IIndex<String, IDatabaseHelper> _databaseHelpers; 

    public void Do() 
    { 
     IDatabaseHelper oledb = this._databaseHelpers["Oledb"]; 
    } 
} 

und Ihre Anmeldung wird wie:

builder.Register(c => new DatabaseHelper(new SqlFactory())) 
     .Named<IDatabaseHelper>("Sql") 
     .PropertiesAutowired(); 

builder.Register(c => new DatabaseHelper(new OleDbFactory())) 
     .Named<IDatabaseHelper>("Oledb") 
     .PropertiesAutowired(); 

Named and Keyed service Siehe von Autofac Dokumentation für weitere Informationen

Verwandte Themen