我正在使用.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异常,可能会有多个问题:
在启动时,确保Hostbuilder服务设置为ServiceProvider值
ServiceProvider=主机。服务;
- 其他可能是T类的构造函数无法解析所使用接口的依赖关系
**
谢谢!快乐编码:)
**
您应该使用
var incoming = serviceProvider.GetService(typeof(IService));