我正在使用.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。您的回答将有很大帮助。
答案 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异常,则可能会出现多个问题:
在启动时,请确保Hostbuilder服务设置为ServiceProvider值
ServiceProvider = host.Services;
**
谢谢!快乐编码:)
**