您不能将开放通用接口与封闭通用实现结合使用。
以下是原因的示例:
services.AddTransient(typeof(IGetItems<,>),typeof(GetItems));
class GetItems : IGetItems<GetResultsParms,GetResults> {}
class Consumer {
public Consumer( IGetItems<String,Int32> getter )
{
// ...
}
}
假设此方法有效,那么Consumer
将被赋予IGetItems<GetResultsParms,GetResults>
,这显然与它对IGetItems<String,Int32>
的请求不兼容。
您需要重新考虑您的界面设计。
我假设IGetItems
是表示单个数据检索操作的接口,该操作应在不同类型上通用(例如,一个消费类将请求IGetItems<CustomersParams,CustomersResults>
,而另一个将进行IGetItems<OrdersParams,OrdersResults>
)。
为此,您需要一个自定义工厂-而不是特定的实现类型。但是,您需要提供更多有关IGetItems
的工作方式以及如何创建类型参数的值/实例的详细信息。
或者,如果在编译时知道类型参数的每个可能的类型参数,则只需注册每个可能的组合:
services.AddTransient(typeof(IGetItems<CustomersParams,CustomersResults>),typeof(CustomersGetter));
services.AddTransient(typeof(IGetItems<OrdersParams,OrdersResults>),typeof(OrdersGetter));
services.AddTransient(typeof(IGetItems<ProductsParams,ProductsResults>),typeof(ProductsGetter));
...使用通用重载可以更简洁地完成此操作:
services.AddTransient< IGetItems< CustomersParams,CustomersResults>,CustomersGetter >();
services.AddTransient< IGetItems< OrdersParams,OrdersResults>,OrdersGetter>();
services.AddTransient< IGetItems< ProductsParams,ProductsResults>,ProductsGetter>();
本文链接:https://www.f2er.com/3120281.html