2016-03-21 13 views
2

Simple Injectorで引数を持つジェネリック型を登録する方法
(最新SimpleInjectorバージョンv3)。Simple Injectorでコンストラクタ引数を持つジェネリック型を登録する

私のインターフェイスはです。

public interface IDbHelper<T> where T : class 
{ 

    void SetInformation(string title, string description); 
} 

マイクラスの実装。

public class JsonDbWrapper<T> : IDbHelper<T> where T : class 
{ 
    private readonly JsonDb<T> _jsonFile; 

    public JsonDbWrapper(string path, string filename, Encoding encoding) 
    { 
     _jsonFile = JsonDb<T>.GetInstance(path, filename, encoding); 
    } 


    public void SetInformation(string title, string description) { ... } 
} 

私は勿論、それは例外を投げ、以下試してみました:

container.Register(typeof(IDbHelper<>), typeof(JsonDbWrapper<>)); 

例外があります。

Error: System.ArgumentException: The constructor of type JsonDbWrapper<T> contains parameter 'path' of type String which can not be used for constructor injection.

パス、ファイル名、およびエンコードを設定する方法を作成できます。しかし、私はそれらをコンストラクタに入れたい。 Simple Injectorを使う正しい方法を学びたい。

+0

に登録することで、パス、ファイル名およびエンコーディング定数である、またはそれらを総称ごとに異なりますタイプ?すべての 'T 'は同じ値を持っていますか? – Steven

+0

@スティーブン不明な質問を申し訳ありません。例:pathは "D:\ MyJsonFolder \"、ファイル名は "persons.json"です.TはPersonクラスです。別の例:TはAccountクラスなどのため、パスは "D:\ MyJsonFolder \"、ファイル名は "accounts.json"です。 –

+0

Turbotの答えは正しいです – Steven

答えて

3

あなたが準デシベルクラスで各ヘルパーを登録したい場合(例えば人)

オプションは、デリゲート

container.Register<IDbHelper<Person>>(() => new JsonDbWrapper<Person>("path","filename",Encoding.UTF8)); 
var result = container.GetInstance<IDbHelper<Person>>(); 
関連する問題