На вашем месте я бы придумал какую-то службу приложений, например IApplicationControlService
, который вы можете настроить для внедрения в ваши обработчики с использованием любого контейнера IoC, который вы используете.
Это может выглядеть примерно так:
public interface IApplicationControlService
{
void RequestApplicationShutdown();
}
и тогда ваш код может просто
public class YourHandler : IHandleMessages<EditedEventData>
{
readonly IApplicationControlService applicationControlService;
public YourHandler(IApplicationControlService applicationControlService)
{
this.applicationControlService = applicationControlService;
}
public async Task Handle(EditedEventData message)
{
// (...)
foreach (var item in messages)
{
try
{
await _bus.Publish(item);
}
catch (Exception ex)
{
_logger.LogCritical("Publishing event message {@item} failed with error {ex}", item, ex);
applicationControlService.RequestApplicationShutdown();
}
}
}
}
запросить остановку приложения при возникновении ошибки.
Реализация IApplicationControlService
может тогда быть чем-то вроде
public class BruteForceApplicationControlService : IApplicationControlService
{
public void RequestApplicationShutdown()
{
Environment.FailFast("you should probably not do THIS ?");
}
}
или что-то более мягкое the суть в том, что вы сможете предоставить способ запроса приложения на закрытие «извне», скорее всего, из места, где ваше приложение собрано (т. Е. «корень композиции» )