c# - 如何将 Microsoft.Extensions.DependencyInjection.IServiceScope 注入 .NET Core 中的类
问题描述
我在注入IServiceScope
我的班级时遇到问题。
我的服务实现:
public class AccountService : IAccountService
{
private readonly IConfiguration _configuration;
private readonly IServiceScope _services;
public AccountService(
IConfiguration configuration,
IServiceScope services) // <-- I can't inject this
{
_configuration = configuration;
_services = services;
}
public async Task CreateAccount(ExternalAccount externalAccount)
{
(some code...)
}
}
在startup.cs中:
services.AddTransient<IAccountService, AccountService>();
问题是项目在上述行之后崩溃并出现以下错误:
无法构造某些服务(验证服务描述符“ServiceType:IDS.Quickstart.Account.IAccountService Lifetime:Transient ImplementationType:IDS.Quickstart.Account.AccountService”时出错:无法解析类型“Microsoft.Extensions”的服务。 DependencyInjection.IServiceScope',同时尝试激活'IDS.Quickstart.Account.AccountService'。)---> System.InvalidOperationException:验证服务描述符'ServiceType:IDS.Quickstart.Account.IAccountService Lifetime:Transient ImplementationType:IDS时出错。 Quickstart.Account.AccountService':尝试激活“IDS.Quickstart.Account.AccountService”时,无法解析类型“Microsoft.Extensions.DependencyInjection.IServiceScope”的服务。
我的代码拒绝工作的原因是什么?
解决方案
而不是注入一个IServiceScope
, 与 MS.DI 你注入一个IServiceProvider
. MS.DI 将自动注入一个IServiceProvider
范围为当前范围的版本。这意味着您的班级可以调用IServiceProvider.GetService
,这将导致与调用时相同的结果IServiceScope.ServiceProvider.GetService
。
请小心注入特定于容器的抽象,例如IServiceProvider
,IServiceScopeFactory
或IServiceScope
. 如果注入到位于您的Composition Root之外的类中,则会导致Service Locator 反模式。服务定位器有很多缺点。你的班级的名字AccountService
,让我相信这个班级生活在你的作文根之外。
存在于组合根中的类通常仅包含基础架构逻辑(无业务逻辑)。在 Composition Root 中,对 DI 容器(或其抽象)有依赖性是很好的,因为这部分已经对那个特定的 DI 容器有很强的依赖性。
因此,如果可以,请从AccountService
类中提取解析实例所需的逻辑,并将其移动到仅包含基础架构逻辑的类中,并将其放置在组合根中。
推荐阅读
- ssrs-2012 - SSRS 2012 报告中未出现水平滚动条
- c# - 从 C# 在 microsoft word 中插入对象列表
- tensorflow - 如何使用 Tensorflow 将张量的每一列乘以另一个张量的所有列?
- java - 内存缓存 (CaffeineCache) 能否在应用程序重新启动后继续存在?
- java - org.springframework.web.client.HttpClientErrorException:404 未找到
- apache - Apache2 + Symfony4 + 子文件夹 = 问题
- python - 没有使用 python 3.6 和 apache2 的名为 celery 的模块
- python - 将 Numpy 导入 Sublime Text 3
- ruby-on-rails - Rails 聊天应用程序的 FAYE_URL 值应该是多少?
- javascript - google-maps-react 中未显示标记