51

我正在使用 .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)
      {
      } 

      ...
}

另一个基础服务

public abstract class BaseService
{
   protected readonly ILogger Logger;

   protected BaseService(ILogger logger)
   {
      Logger = logger;
   }

   ...
}

我是如何注册它们的。

serviceCollection.AddScoped<IService, Service>();

我如何获得所需的服务。

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

注意:我刚开始使用依赖注入、.NET Core,还不知道关于 DI 的一切。你的回答会有很大帮助。

4

3 回答 3

173

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

using Microsoft.Extensions.DependencyInjection;

允许编译器找到它。

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

除非服务可用,否则应用程序无法运行时,应使用GetRequiredService 。如果无法创建实例,则会抛出 InvalidOperationException。

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

于 2019-01-16T12:26:37.090 回答
6

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

你可以打电话

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

或者你可以添加一个

using Microsoft.Extensions.DependencyInjection;

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

于 2019-01-16T12:25:32.200 回答
2

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

ServiceProvider.GetService<T>(); 

使用需要明确定义的以下命名空间,而不是依赖于智能感知

using Microsoft.Extensions.DependencyInjection;

另外请注意,如果在此之后出现空异常,可能会出现多个问题:

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

    服务提供者 = 主机。服务;

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

**

谢谢 !快乐编码:)

**

于 2020-04-19T19:31:51.653 回答