如何在Startup.cs中注册Generic类型的接口

saj*_*saj 2 c# generics dependency-injection .net-core asp.net-core

我在ASP.NET Core中使用WebAPI.

这有效:

services.AddScoped<IApiKeysService, APIKeysService>();
Run Code Online (Sandbox Code Playgroud)

现在接口返回泛型类型T这不是

services.AddScoped<IApiKeysService>();
Run Code Online (Sandbox Code Playgroud)

错误使用泛型类型blah需要1种类型的参数

或这个

services.AddScoped<IApiKeysService<T>>();
Run Code Online (Sandbox Code Playgroud)

我得到以下编译错误

无法找到类型或命名空间T.

我该如何注册Startup.cs

注意:我不能使用具体类型,因为接口成员是具有泛型方法的基类.

Nig*_*888 7

接口

您无法实例化接口,因此无法在没有实现类型(无论是否通用)的情况下注册接口.

但是,可以将类型注册为具体类型而不是接口.

services.AddScoped(typeof(Foo<>));
Run Code Online (Sandbox Code Playgroud)

在构造函数中指定为:

public MyService(Foo<ClosingType> foo)
{
    // implementation
}
Run Code Online (Sandbox Code Playgroud)

打开泛型

开放泛型总是在.NET中以相同的方式指定:typeof(SomeGenericType<>).

services.AddScoped(typeof(IFoo<>), typeof(Foo<>));
Run Code Online (Sandbox Code Playgroud)

如果有多个打开的通用参数,您可以使用逗号指定多少个.例如,使用2个开放的通用参数:

services.AddScoped(typeof(IFoo<,>), typeof(Foo<,>));
Run Code Online (Sandbox Code Playgroud)