依赖注入与通用

时间:2015-01-12 03:32:18

标签: c# asp.net-mvc generics dependency-injection

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

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... 
     }
}

这不起作用,但是在这个阶段如何在通用程序涉及此级别时如何实现和执行依赖注入?它甚至可能吗?

1 个答案:

答案 0 :(得分:1)

我同意一些评论,如果没有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);
    }
}