不能与类型参数一起使用的非泛型方法'IServiceProvider.GetService(Type)'



我正在使用.NET Core依赖项注入,但当我试图在另一个类中获取服务时,我会收到"IServiceProvider.GetService(Type)"不能与类型参数一起使用的错误。

这个错误意味着什么?我知道泛型类型参数是这样的:GenericInterface<>,并且GetService方法不采用GenericInterface<>作为论据。

为什么我会出现这个错误,我该如何解决它?

接口

public interface IService
{
void Process();
}

实现接口的类

public class Service : BaseService<IConfig, SomType>
{
public Service(
ILogger logger : base(logger)
{
}
...
}

BaseService类是一个抽象类,它实现了IService接口。

public abstract class BaseService<TConfig, TE> : AnotherBaseService, IService where TConfig : IConfig where TE : struct, IConvertible
{
protected BaseService(ILogger logger): base(logger)
{
} 
...
}

AnotherBaseService

public abstract class BaseService
{
protected readonly ILogger Logger;
protected BaseService(ILogger logger)
{
Logger = logger;
}
...
}

我是如何注册的。

serviceCollection.AddScoped<IService, Service>();

我是如何获得所需服务的。

var incoming = serviceProvider.GetService<IService>();

注意:我刚开始使用依赖注入,.NET核心,还不知道DI的一切。你的回答将大有帮助。

通用的GetService<T> 方法是一种扩展方法。这意味着你需要有一个:

using Microsoft.Extensions.DependencyInjection;

以允许编译器找到它。

此方法仅适用于可选服务。如果无法构造对象,则它将返回null,原因可能是该类型未注册,也可能是缺少某些依赖项。

除非有可用的服务,否则应用程序无法工作时,应使用GetRequiredService。如果无法创建实例,则会引发InvalidOperationException。

当抛出该异常时,完整的异常文本将是查找实际问题的巨大帮助。构造函数中引发的异常可以出现在Exception.InnerException属性中。最终引发异常的调用序列将显示在StackTrace属性中。调用Exception.ToString()将返回一个字符串,该字符串包含当前异常和任何内部异常的所有信息。

这意味着您的编译器只知道采用类型的方法。

你可以打电话给

var incoming = serviceProvider.GetService(typeof(IService));

或者你可以添加一个

using Microsoft.Extensions.DependencyInjection;

以确保您的编译器知道允许您将类型指定为泛型参数的扩展方法。这可能需要安装程序包Microsoft.Extensions.DependencyInjection.Abstractions

简短的答案在上面的帖子中得到了很好的解释:

ServiceProvider.GetService<T>(); 

使用以下命名空间,该命名空间需要明确定义,而不是依赖intellisense

using Microsoft.Extensions.DependencyInjection;

还要注意,如果你在这之后得到null异常,可能会有多个问题:

  1. 在启动时,确保Hostbuilder服务设置为ServiceProvider值

    ServiceProvider=主机。服务;

  2. 其他可能是T类的构造函数无法解析所使用接口的依赖关系

**

谢谢!快乐编码:)

**

您应该使用

var incoming = serviceProvider.GetService(typeof(IService));

最新更新