依赖注入与泛型相结合

Dependency Injection coupled with a Generic

我已经非常熟悉 依赖注入 和松散耦合组件的强大功能。当我出于教育目的试图增强或构建它时,我偶然发现了一个问题:

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 class 封装了接口。

通过重命名最后一个 class ReaderProxy 为了清楚起见,我试图让你的代码更进一步,希望展示如何在没有框架或自定义初始化的情况下进行依赖注入可以简化实际初始化行的通用对象。

下面的代码将展示如何使用依赖注入(参见 fiddle:https://dotnetfiddle.net/cfNCyl)。

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

下面是上述代码(包括一个简单的 CustomerModel)所需的 classes 和接口:

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