在 C# 中,如何使用泛型的基 class 将泛型接口的所有实例注入到单个构造函数中?
In C# how to inject all instances of generic interface into a single constructor using the generic's base class?
我定义了以下接口:
public interface ICustomService<T> where T : CustomObject
{
IEnumerable<T> GetById(int Id);
...
}
还有它的 2 个实现,其中 MyObject1
和 MyObject2
都继承自 CustomObject
public class CustomService1 : ICustomService<MyObject1>
{
public IEnumerable<MyObject1> GetById(int Id)
{
...
}
}
public class CustomService2 : ICustomService<MyObject2>
{
public IEnumerable<MyObject2> GetById(int Id)
{
...
}
}
我尝试将这两个注册为 ICustomService<CustomObject>
但出现错误:
There is no implicit reference conversion from 'CustomerService1' to 'ICustomService<CustomObject>'
改为这样注册:
services.AddTransient<ICustomService<MyObject1>, CustomService1>();
services.AddTransient<ICustomService<MyObject2>, CustomService2>();
像上面那样注册时,我的 IEnumerable services
是空的:
public ThirdService(IEnumerable<ICustomService<CustomObject>> services)
{
}
如何将 ICustomService
的所有实现注入 ThirdService
?
我正在尝试这样做,以便可以为 ThirdService
提供一个 ID,然后在所有服务上使用 GetById
获取所有具有该 ID 的 CustomObject
。
假设没有其他接口方法具有类型 T
的参数、类型 T
的可变属性,或 return 使用 [=12= 的泛型类型的方法] 以 non-covariant 的方式,您可以使用 out
:
使 T
协变
public interface ICustomService<out T> where T : CustomObject
这将使您的注册尝试有效:
services.AddTransient<ICustomService<MyObject>, CustomService1>();
services.AddTransient<ICustomService<MyObject>, CustomService2>();
Covariance 确保 CustomService1
和 CustomService2
可以安全地用于代替 ICustomService<MyObject>
,尽管它们都将 MyObject
的子类声明为通用参数。
我定义了以下接口:
public interface ICustomService<T> where T : CustomObject
{
IEnumerable<T> GetById(int Id);
...
}
还有它的 2 个实现,其中 MyObject1
和 MyObject2
都继承自 CustomObject
public class CustomService1 : ICustomService<MyObject1>
{
public IEnumerable<MyObject1> GetById(int Id)
{
...
}
}
public class CustomService2 : ICustomService<MyObject2>
{
public IEnumerable<MyObject2> GetById(int Id)
{
...
}
}
我尝试将这两个注册为 ICustomService<CustomObject>
但出现错误:
There is no implicit reference conversion from 'CustomerService1' to 'ICustomService<CustomObject>'
改为这样注册:
services.AddTransient<ICustomService<MyObject1>, CustomService1>();
services.AddTransient<ICustomService<MyObject2>, CustomService2>();
像上面那样注册时,我的 IEnumerable services
是空的:
public ThirdService(IEnumerable<ICustomService<CustomObject>> services)
{
}
如何将 ICustomService
的所有实现注入 ThirdService
?
我正在尝试这样做,以便可以为 ThirdService
提供一个 ID,然后在所有服务上使用 GetById
获取所有具有该 ID 的 CustomObject
。
假设没有其他接口方法具有类型 T
的参数、类型 T
的可变属性,或 return 使用 [=12= 的泛型类型的方法] 以 non-covariant 的方式,您可以使用 out
:
T
协变
public interface ICustomService<out T> where T : CustomObject
这将使您的注册尝试有效:
services.AddTransient<ICustomService<MyObject>, CustomService1>();
services.AddTransient<ICustomService<MyObject>, CustomService2>();
Covariance 确保 CustomService1
和 CustomService2
可以安全地用于代替 ICustomService<MyObject>
,尽管它们都将 MyObject
的子类声明为通用参数。