2016-03-21 18 views
2

içinde kurucu argümanları bulunan genel türleri kaydetme Basit Enjektörde (
(en son SimpleInjector sürüm v3) argümanları olan genel türler nasıl kaydedilir;Simple Injector

Arabirim;

public interface IDbHelper<T> where T : class 
{ 

    void SetInformation(string title, string description); 
} 

Sınıf uygulamam;

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) { ... } 
} 

Ben tabii o bir istisna atıyor aşağıdaki çalıştı:

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

İstisna olduğu;

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

Yol, dosya adı ve kodlamayı ayarlamak için bir yöntem oluşturabilirim. Ama ben onları kurucuda istiyorum. Basit Enjektör'ü kullanmanın uygun yolunu öğrenmek istiyorum. Eğer ortak db sınıfı (örn Kişi) her yardımcı kaydettirmek istiyorsanız

+0

Are yol, dosya adı ve kodlama sabitlerini kayıt, ya da jenerik başına değişir yapmak yazın? Tüm 'T'lerin aynı değerleri var mı? – Steven

+0

@Steven Belirsiz bir soru için üzgünüz. Bir örnek: yol "D: \ MyJsonFolder \", dosyaAdı: "persons.json" çünkü T kişi sınıfıdır. Başka bir örnek: yol "D: \ MyJsonFolder \", dosyaAdı: "accounts.json" çünkü T Hesap sınıfı vb. –

+0

Turbot'un cevabı doğru – Steven

cevap

3

seçenek temsilci ile

container.Register<IDbHelper<Person>>(() => new JsonDbWrapper<Person>("path","filename",Encoding.UTF8)); 
var result = container.GetInstance<IDbHelper<Person>>();