2015-01-12 51 views
2

我已經非常熟悉依賴注入和鬆散耦合組件的功能。當我設法加強或擴大這一教育目的我碰到一個問題,迷迷糊糊:依賴注入加上通用

public interface IReader<TParameter, TOutput> 
{ 
    TOutput Read(TParameter parameter); 
} 

public class Customer : IReader<int, CustomerModel> 
{ 
    public CustomerModel Read(int parameter) 
    {  
      // Implementation... 
    } 
} 

當您嘗試使用依賴注入的問題就來了。我嘗試:

public class Reader<TParameter, TOutput> 
{ 
    private IReader<TParameter, TOutput> reader; 
    public Reader(IReader<TParameter, TOutput> reader) 
    { 
      // Link through Constructor... 
    } 
} 

這並不工作,但在這個階段,你怎麼能實現,當一個普通的參與在這個級別進行依賴注入?它甚至有可能嗎?

+0

哪些IoC容器您使用的?我知道Unity應該可以使用'container.RegisterType ,Customer>()',其他框架可能會更有限。 – Jarga

+0

@Jarga目前還沒有人想要首先嚐試前提條件而不用IoC框架。 – Greg

+0

看看這個鏈接是否回答你的問題:http://stackoverflow.com/questions/700966/generic-type-in​​-constructor [1]: – wigs

回答

1

我同意一些評論,如果沒有IOC框架或公平的自定義反射,你不會用這種簡單的.NET來獲得類似泛型的.NET。您似乎要描述的模式是代理模式,最後一個Reader類封裝了接口。

爲了清楚起見,通過重命名最後一個類ReaderProxy,我試圖讓你的代碼更進一步,希望展示如何在沒有可以簡化實際初始化行的通用對象的框架或自定義初始化的情況下執行依賴注入。

下面的代碼將顯示如何使用依賴注入(請參閱小提琴:https://dotnetfiddle.net/cfNCyl)。

var reader = new ReaderProxy<int, CustomerModel>(new Customer()); 
var model = reader.Read(5); 
Console.WriteLine(model.Id); 

這裏是上面的代碼(包括簡單CustomerModel)所需的類和接口:

public interface IReader<TParameter, TOutput> 
{ 
    TOutput Read(TParameter parameter); 
} 

public class Customer : IReader<int, CustomerModel> 
{ 
    public CustomerModel Read(int parameter) 
    {  
     return new CustomerModel() { Id = parameter }; 
    } 
} 

public class CustomerModel 
{ 
    public int Id { get; set; } 
} 

public class ReaderProxy<TParameter, TOutput> 
    : IReader<TParameter, TOutput> 
{ 
    private IReader<TParameter, TOutput> reader; 
    public ReaderProxy(IReader<TParameter, TOutput> reader) 
    { 
      this.reader = reader; 
    } 
    public TOutput Read(TParameter parameter) 
    { 
     return this.reader.Read(parameter); 
    } 
}