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

579*_*913 11 c# console-application .net-core dependency-inversion

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

这个错误意味着什么?我知道泛型类型的参数是这样的:GenericInterface <>,而GetService方法不会将GenericInterface <>作为参数.

为什么我会收到此错误,如何解决?

界面

public interface IService
{
   void Process();
}
Run Code Online (Sandbox Code Playgroud)

实现接口的类

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

      ...
}
Run Code Online (Sandbox Code Playgroud)

AnotherBaseService

public abstract class BaseService
{
   protected readonly ILogger Logger;

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

   ...
}
Run Code Online (Sandbox Code Playgroud)

我是如何注册的.

serviceCollection.AddScoped<IService, Service>();
Run Code Online (Sandbox Code Playgroud)

我如何获得我需要的服务.

var incoming = serviceProvider.GetService<IService>();
Run Code Online (Sandbox Code Playgroud)

注意:我刚开始使用依赖注入,.NET Core并且还不了解DI的所有内容.你的答案会有很大的帮助.

Pan*_*vos 39

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

using Microsoft.Extensions.DependencyInjection;
Run Code Online (Sandbox Code Playgroud)

允许编译器找到它.

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

除非服务可用,否则应该在应用程序无法工作时使用GetRequiredService.如果无法创建实例,则会抛出InvalidOperationException.

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


nvo*_*igt 5

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

你可以打电话

var incoming = serviceProvider.GetService(typeof(IService));
Run Code Online (Sandbox Code Playgroud)

或者你可以添加一个

using Microsoft.Extensions.DependencyInjection;
Run Code Online (Sandbox Code Playgroud)

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