我已经对依赖注入和松耦合组件的功能非常熟悉。当我出于教育目的寻求增强或扩展时,偶然发现一个问题:
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...
}
}
那是行不通的,但是在此阶段,当泛型涉及此级别时,如何实现和执行依赖注入?可能吗?
最佳答案
我同意其中一些意见,即如果没有IOC框架或相当多的自定义反映,那么对于像这种情况的泛型,使用简单的.NET不会从DI中获得太多收益。您似乎要描述的模式是带有最后一个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);
}
}