在 API 准备好之前,在代码初始化期间运行一些代码的好解决方案是什么?
我需要在此代码中访问 IoC,最好是如果此代码失败,API 甚至不应该完成启动。
今天我正在运行一个
IHostedService
,在某处有一个标志表明它成功了,然后我有一个中间件监视该标志,如果它没有正确完成,我会短路对 API 的任何请求,但它似乎比它更复杂应该是。
我记得看到 IHostedServices 的行为发生了一些变化,它们将在启动期间同步运行,因此它们的注册顺序很重要。但我现在在任何地方都找不到这个信息,不确定是不是我的头脑在捉弄我。
我记得看到 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 变得可用。
此外,在初始化逻辑中适当处理异常。
注意:请记住,这不是您问题的确切解决方案,而是处理该场景的方法之一。如果您对此仍有更多担忧,我强烈建议您发布新问题以及可重现的示例,以便可以进行相应的调查。请参考这个官方文档这可能对你来说有见地。