То, что вам нужно sh, не поддерживается в MS.DI. . NET Встроенный в ядро контейнер DI очень ограничен (или, возможно, даже наивен), когда дело доходит до обработки общих c типов.
Например, вот три (скорее базовые c) использования случаи для общих типов c, все не поддерживаемые MS.DI:
// Example generic abstraction
public interface IGeneric<TKey, TValue> where TKey : struct { }
// Type with a different number of generic types than the abstraction
public class MonoGeneric<TKey> : IGeneric<TKey, string> where TKey : struct { }
// Type with the generic types in a different order
public class SwappedGeneric<TValue, TKey> : IGeneric<TKey, TValue>
where TKey : struct { }
// Type where the generic types don't exactly map to those of the abstraction
// NOTE: This is your use case.
public class ConstrainedGeneric<TKey, TValue> : IGeneric<TKey, List<TValue>>
where TKey : struct { }
// Registration
services.AddTransient(typeof(IGeneric<,>), typeof(MonoGeneric<>));
services.AddTransient(typeof(IGeneric<,>), typeof(SwappedGeneric<,>));
services.AddTransient(typeof(IGeneric<,>), typeof(ConstrainedGeneric<,>));
// Usage
// Should work on any of the registrations, but it fails on all!
provider.GetRequiredService<IGeneric<int, string>>();
Мало того, что это не поддерживается, сообщения об исключениях, создаваемые MS.DI, будут очень бесполезными и запутанными.
IMO, ваш вариант использования очень допустим, поэтому многие контейнеры DI фактически поддерживают этот вариант использования. Мой совет: выберите более зрелый контейнер DI и проверьте, поддерживает ли он тот способ, которым вы хотите применять дженерики.