在.net Core中注册未绑定的泛型时无法获取服务

在使用类注册未绑定的泛型时,我无法将服务注入到我的对象中:

services.AddTransient(typeof(IGetItems<,>),typeof(GetItems));
//Exampe class 
public class GetItems : IGetItems<GetResultsParms,GetResults> {}

我得到的错误是:

requires registering an open generic implementation type

如何解决此问题?

lengci 回答:在.net Core中注册未绑定的泛型时无法获取服务

您不能将开放通用接口与封闭通用实现结合使用。

以下是原因的示例:

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

大家都在问