我已经非常熟悉依赖注入(inject) 和松散耦合组件的强大功能。当我出于教育目的试图增强或构建它时,我偶然发现了一个问题:
public interface IReader<TParameter, TOutput>
{
TOutput Read(TParameter parameter);
}
public class Customer : IReader<int, CustomerModel>
{
public CustomerModel Read(int parameter)
{
// Implementation...
}
}
当您尝试使用依赖注入(inject) 时,问题就来了。我尝试过:
public class Reader<TParameter, TOutput>
{
private IReader<TParameter, TOutput> reader;
public Reader(IReader<TParameter, TOutput> reader)
{
// Link through Constructor...
}
}
这行不通,但是在这个阶段,如果在此级别涉及泛型,您如何实现和执行依赖注入(inject)?有可能吗?
我同意一些评论,如果没有 IOC 框架或相当多的自定义反射,对于像这种情况这样的泛型,您将无法使用简单的 .NET 从 DI 中获得太多好处。您描述的模式似乎是一个代理模式,最后一个 Reader
类封装了接口(interface)。
为了清楚起见,通过重命名最后一个类 ReaderProxy
,我试图让您的代码更进一步,希望展示如何在没有框架或通用对象的自定义初始化的情况下进行依赖注入(inject)可以简化实际的初始化行。
下面的代码将展示如何使用依赖注入(inject)(参见 fiddle :https://dotnetfiddle.net/cfNCyl)。
var reader = new ReaderProxy<int, CustomerModel>(new Customer());
var model = reader.Read(5);
Console.WriteLine(model.Id);
下面是上述代码所需的类和接口(interface)(包括一个简单的 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);
}
}
我是一名优秀的程序员,十分优秀!