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

时间:2019-01-16 12:18:21

标签: c# .net-core console-application dependency-inversion

我正在使用.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 Core,现在还不了解DI。您的回答将有很大帮助。

3 个答案:

答案 0 :(得分:14)

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

using Microsoft.Extensions.DependencyInjection;

允许编译器找到它。

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

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

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

答案 1 :(得分:1)

这意味着您的编译器仅了解采用类型的方法。

您可以致电

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

或者您可以添加

using Microsoft.Extensions.DependencyInjection;

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

答案 2 :(得分:0)

上面的帖子很好地解释了简短的答案:

ServiceProvider.GetService<T>(); 

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

using Microsoft.Extensions.DependencyInjection;

还请注意,如果在此之后收到null异常,则可能会出现多个问题:

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

    ServiceProvider = host.Services;

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

**

谢谢!快乐编码:)

**