c# - 依赖注入(inject)与泛型相结合

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

我已经非常熟悉依赖注入(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);
    }
}

关于c# - 依赖注入(inject)与泛型相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27894933/

相关文章:

c# - 我是否需要反序列化来自 DocumentDb 的查询结果?

generics - Swift 中符合 Comparable 的泛型类

c# - 如何在WPF中基于索引动态生成Togglebutton并对其执行操作

c# - 将图像转换为按钮 WPF

c# - 如何在 ASP.NET MVC View 中获取对象属性的子字符串?

asp.net - 防止负载均衡器在长时间运行期间超时

c# - 在哪里放置栅栏/内存屏障以保证新的读取/提交的写入?

c# - 如何发布包含 Iformfile 的 View 模型数组的表单?

java - 使用 Google Collections "No suitable method found for uniqueIndex..."将列表转换为 map (获取类型一致的问题)

entity-framework - 如何在 Entity Framework 通用插入方法中返回插入记录的 ID?