如何将 IServiceScope 注入到 .NET Core 中的类中

Ada*_*zek 5 c# dependency-injection .net-core asp.net-core-3.0

Microsoft.Extensions.DependencyInjection.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...)
    }
}
Run Code Online (Sandbox Code Playgroud)

在startup.cs中:

services.AddTransient<IAccountService, AccountService>();
Run Code Online (Sandbox Code Playgroud)

问题是项目在上述行之后崩溃并出现以下错误:

某些服务无法构建(验证服务描述符“ServiceType:IDS.Quickstart.Account.IAccountService 生命周期时出错:瞬态实现类型:IDS.Quickstart.Account.AccountService”:无法解析类型“Microsoft.Extensions”的服务。尝试激活“IDS.Quickstart.Account.AccountService”时出现 DependencyInjection.IServiceScope”。) ---> System.InvalidOperationException:验证服务描述符“ServiceType:IDS.Quickstart.Account.IAccountService 时出错”生命周期:瞬态实现类型:IDS。 Quickstart.Account.AccountService”:尝试激活“IDS.Quickstart.Account.AccountService”时无法解析类型“Microsoft.Extensions.DependencyInjection.IServiceScope”的服务。

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

Ste*_*ven 11

使用IServiceScopeMS.DI,您可以注入一个IServiceProvider. IServiceProviderMS.DI 将自动注入作用域为当前作用域的版本。这意味着您的类可以调用IServiceProvider.GetService,这将导致与您调用时发生的结果相同的结果IServiceScope.ServiceProvider.GetService

请小心注入特定于容器的抽象,例如IServiceProviderIServiceScopeFactoryIServiceScope如果注入到组合根之外的类中,则会导致服务定位器反模式。服务定位器有很多缺点。你的类的名称,AccountService让我相信这个类位于你的组合根之外。

位于组合根内的类通常仅包含基础设施逻辑(无业务逻辑)。在组合根中,可以依赖 DI 容器(或其抽象),因为这部分已经对该特定 DI 容器具有非常强的依赖关系。

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