我已经对依赖注入和松耦合组件的功能非常熟悉。当我出于教育目的寻求增强或扩展时,偶然发现一个问题:

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);
    }
}

10-08 19:28