【问题标题】:Dependency injection for generic interface with two type arguments具有两个类型参数的通用接口的依赖注入
【发布时间】:2021-04-24 09:11:45
【问题描述】:

所以我试图注入一个通用存储库,它接收实体类型和实体使用的键类型作为通用类型。

声明看起来像这样:

public class GenericRepository<KeyType, T> : BaseRepository<T, NpgsqlConnection>, IGenericRepository<KeyType, T> 
        where T : class
        where KeyType : struct

所以我尝试像这样注入它们:

services.AddTransient(typeof(IGenericRepository<>), typeof(GenericRepository<>));

这适用于只有一种泛型类型但不适用于两种泛型类型的情况。我收到以下错误:

使用泛型类型 'GenericRepository' 需要 2 个类型参数

有人知道如何解决这个问题吗?

我知道我可以为每一个都做类,但我想像这样注入它:

public class RestaurantTypesService : IRestaurantTypesService
{
    private readonly IGenericRepository<long, RestaurantType> _restaurantTypeRepository;

    public RestaurantTypesService(IGenericRepository<long, RestaurantType> repository)
    {
        _restaurantTypeRepository = repository;
    }
}

【问题讨论】:

    标签: c# asp.net-core dependency-injection


    【解决方案1】:

    这被称为未绑定类型

    多个Unbound Generic Type参数用逗号表示。

    • 1 - SomeType&lt;&gt;

    • 2 - SomeType&lt;,&gt;

    • N - SomeType&lt;,(n-1)&gt;

    基本上应该这么简单

    service.AddTransient(typeof(IGenericRepository<,>), typeof(GenericRepository<,>));
    

    世界上最人为的例子

    public interface IGenericRepository<T, T2> { }
    
    public class GenericRepository<T, T2> : IGenericRepository<T, T2> { }
    
    public class Bob
    {
       private IGenericRepository<int, int> _something;
    
       public Bob(IGenericRepository<int,int> something)
       {
          _something = something;
          Console.WriteLine(something.GetType().Name);
       }
    }
    
    ...
    
    var service = new ServiceCollection();
    
    service.AddTransient(typeof(IGenericRepository<,>), typeof(GenericRepository<,>));
    service.AddTransient<Bob>();
    
    var provider = service.BuildServiceProvider();
    var sdfg=provider.GetService(typeof(Bob));
    

    【讨论】:

      猜你喜欢
      • 2018-11-18
      • 2014-10-06
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      相关资源
      最近更新 更多