在 API 准备好之前运行 ASP.NET IHostedService

问题描述 投票:0回答:1

在 API 准备好之前,在代码初始化期间运行一些代码的好解决方案是什么?

我需要在此代码中访问 IoC,最好是如果此代码失败,API 甚至不应该完成启动。

今天我正在运行一个

IHostedService
,在某处有一个标志表明它成功了,然后我有一个中间件监视该标志,如果它没有正确完成,我会短路对 API 的任何请求,但它似乎比它更复杂应该是。

我记得看到 IHostedServices 的行为发生了一些变化,它们将在启动期间同步运行,因此它们的注册顺序很重要。但我现在在任何地方都找不到这个信息,不确定是不是我的头脑在捉弄我。

asp.net-core
1个回答
0
投票

我记得看到 IHostedServices 的行为发生了一些变化, 它们将在启动期间同步运行,以便顺序 它们是已登记的事项。但我找不到这个信息 现在在任何地方,不确定是不是我的思想在欺骗我。

根据您的描述和场景,您说得对,IHostedService 的行为在 ASP.NET Core 3.0 及更高版本中发生了变化。在这些版本中,托管服务默认异步启动,注册顺序不一定决定启动期间的执行顺序。

如果您需要在应用程序初始化期间、API 准备好之前运行一些代码,并且您希望确保对 IoC 的访问,并可能在该代码失败时阻止 API 启动,那么您的行为是正确的

IHostedService 
在 ASP.NET Core 3.0 及更高版本中已更改。在这些版本中,托管服务默认异步启动,注册顺序不一定决定启动期间的执行顺序。

我需要在此代码中访问 IoC,最好是在该代码失败的情况下 API 甚至不应该完成启动。在那种情况下会是什么 在代码初始化期间运行一些代码的好解决方案 API准备好了吗?

如果您需要在初始化期间运行一些代码,并且想要访问 IoC 并可能在该代码失败时阻止 API 启动,

在这种情况下,创建一个实现 IHostedService 的类来封装您的初始化代码。然后在 IHostedService 的构造函数中,从 IoC 容器注入您需要的任何服务。这使您可以在初始化逻辑中完全访问它们。最后,在 StartAsync 方法中,执行初始化任务,根据需要利用注入的服务。

让我们看看如何在实践中实现:

public class InitializationService : IHostedService
{
    private readonly ISomeService _someService; 

    public InitializationService(ISomeService someService)
    {
        _someService = someService;
    }

    public async Task StartAsync(CancellationToken cancellationToken)
    {
        try
        {
            
            await _someService.DoSomethingAsync();
        }
        catch (Exception ex)
        {
            
            logger.LogError(ex, "Initialization failed. Halting application startup.");
            throw;
        }
    }
}

注意: 如您所见,我已注入

ISomeService
执行您需要的相同服务。之后使用
StartAsync

中注入的服务执行初始化任务

程序.cs:

在您的program.cs文件中注册您的服务,如下所示:

builder.Services.AddHostedService<InitializationService>();

按照上面的方式,如果初始化过程中出现失败,则在StartAsync中抛出异常。这会停止应用程序启动过程,从而阻止 API 变得可用。

此外,在初始化逻辑中适当处理异常。

注意:请记住,这不是您问题的确切解决方案,而是处理该场景的方法之一。如果您对此仍有更多担忧,我强烈建议您发布新问题以及可重现的示例,以便可以进行相应的调查。请参考这个官方文档这可能对你来说有见地

© www.soinside.com 2019 - 2024. All rights reserved.