2016-04-27 24 views
1

Autofacで、2つの実装を1つの型で登録します。また、必要に応じて実装を交換する必要があります。しかし、常に1つの実装を取っています。Autofac - 複数の実装を使用

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(); 

とコントローラでは、この

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

のようなものを持っている必要があります。しかし、私の問題はIDatabaseHelperではnullか、それは常にOleDbなくSqlを取っているのいずれかです。

+0

何を参照してください。 *オンデマンド*を意味しますか?異なるサービスのための異なる実装? –

+0

と同じサービスで、OleDbClientとSqlClientの両方にアクセスする必要があります –

+0

あなたが書くと、それは常にOleDbを取るでしょう、1インターフェイスはSqlFactoryまたはOleDbFactoryを取得します –

答えて

2

単一のコンポーネントを解決するときAutofacは、操作に一致する最新の登録コンポーネントを返します。

実装で両方のサービスにアクセスする必要がある場合は、IEnumerable<IDatabaseHelper>に依存することができ、IDatabaseHelper登録サービスがすべて解決されます。

別の解決策は、 IIndex<TKey, TValue>と名付け登録

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"]; 
    } 
} 

に依存すると、あなたの登録は次のようになりますでしょう

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からAutofacドキュメント

関連する問題