首页 > 解决方案 > 如何将 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”的服务。

我的代码拒绝工作的原因是什么?

标签: c#.net-coredependency-injectionasp.net-core-3.0

解决方案


而不是注入一个IServiceScope, 与 MS.DI 你注入一个IServiceProvider. MS.DI 将自动注入一个IServiceProvider范围为当前范围的版本。这意味着您的班级可以调用IServiceProvider.GetService,这将导致与调用时相同的结果IServiceScope.ServiceProvider.GetService

请小心注入特定于容器的抽象,例如IServiceProvider,IServiceScopeFactoryIServiceScope. 如果注入到位于您的Composition Root之外的类中,则会导致Service Locator 反模式。服务定位器有很多缺点。你的班级的名字AccountService,让我相信这个班级生活在你的作文根之外。

存在于组合根中的类通常仅包含基础架构逻辑(无业务逻辑)。在 Composition Root 中,对 DI 容器(或其抽象)有依赖性是很好的,因为这部分已经对那个特定的 DI 容器有很强的依赖性。

因此,如果可以,请从AccountService类中提取解析实例所需的逻辑,并将其移动到仅包含基础架构逻辑的类中,并将其放置在组合根中。


推荐阅读