具有两个类型参数的泛型接口的依赖注入

Car*_*dez 3 c# dependency-injection asp.net-core

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

声明如下所示:

public class GenericRepository<KeyType, T> : BaseRepository<T, NpgsqlConnection>, IGenericRepository<KeyType, T> 
        where T : class
        where KeyType : struct
Run Code Online (Sandbox Code Playgroud)

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

services.AddTransient(typeof(IGenericRepository<>), typeof(GenericRepository<>));
Run Code Online (Sandbox Code Playgroud)

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

使用泛型类型 'GenericRepository<KeyType, T>' 需要 2 个类型参数

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

我知道我可以为每个人都开设课程,但我想像这样注入它:

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

    public RestaurantTypesService(IGenericRepository<long, RestaurantType> repository)
    {
        _restaurantTypeRepository = repository;
    }
}
Run Code Online (Sandbox Code Playgroud)

AAA*_*ddd 9

这称为未绑定类型

多个未绑定的通用类型参数由逗号表示。

  • 1 - SomeType<>

  • 2 - SomeType<,>

  • N - SomeType<,(n-1)>

基本上,它应该很简单

service.AddTransient(typeof(IGenericRepository<,>), typeof(GenericRepository<,>));
Run Code Online (Sandbox Code Playgroud)

世界上最做作的例子

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));
Run Code Online (Sandbox Code Playgroud)