Консольное приложение.NET Core Обработчик команд Mediatr не вызывается

Я столкнулся с проблемой, что обработчик команд Mediatr не вызывается. У меня есть следующая структура решения.

Project.sln -> Application layer (.NET standard class library) -> Jobs (.NET standard class library) -> Job Server (.NET Core console app)

Идея состоит в том, что Job Server использует планировщик (Quartz.NET) для выполнения заданий. Фактическая бизнес-логика находится на прикладном уровне. Прикладной уровень использует шаблон CQRS, который подключен с использованием Mediatr. Я использую библиотеки внедрения зависимостей Microsoft.

Работа сервера Main метод (с кодом DI):

public class Program
{
    static ManualResetEvent _quitEvent = new ManualResetEvent(false);

    static void Main(string[] args)
    {
        Console.WriteLine("Job Server started");

        //DI setup
        var serviceProvider = new ServiceCollection()
            .AddQuartz()
            .AddTransient<InitializeJobServer>()
            .AddTransient<ProcessAdRssFeedsJob>()
            .AddScoped<IConfigService, ConfigService>()
            .AddScoped<IRssService, RssService>()
            .AddScoped<IBaseService, BaseService>()
            .AddMediatR(typeof(ProcessAdSectionsRssCommand).GetType().Assembly)
            .AddDbContext<MyDbContext>(options =>
                options.UseNpgsql("xxx"))
            .AddMemoryCache()
            .BuildServiceProvider();

        Console.CancelKeyPress += (sender, eArgs) => {
            _quitEvent.Set();
            eArgs.Cancel = true;
        };

        Task.Run(async () =>
        {
            await serviceProvider.GetService<InitializeJobServer>().Start();
        });

        _quitEvent.WaitOne();
        Console.WriteLine("Job Server ended");
    }
}

Код от работы Quartz.net:

[DisallowConcurrentExecution]
public class ProcessAdRssFeedsJob : IJob
{
    private readonly IMediator _mediator;

    public ProcessAdRssFeedsJob(IMediator mediator)
    {
        _mediator = mediator;
    }

    public Task Execute(IJobExecutionContext context)
    {
        try
        {
            _mediator.Send(new ProcessAdSectionsRssCommand());               
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
        return null;
    }
}

Медиа команда:

public class ProcessAdSectionsRssCommand : IRequest<bool>
{

    public class Handler : IRequestHandler<ProcessAdSectionsRssCommand, bool>
    {
        private readonly MyDbContext _context;
        private readonly IRssService _rssService;
        private readonly IConfigService _configService;

        public Handler(
            MyDbContext context,
            IRssService rssService,
            IConfigService configService)
        {
            _context = context;
            _rssService = rssService;
            _configService = configService;
        }

        public async Task<bool> Handle(ProcessAdSectionsRssCommand request, CancellationToken cancellationToken)
        {
            var config = await _configService.GetAllConfigs();

            var r0 = await _rssService.GetAdSectionRssUrls();
            // etc.
            return true;
        }
    }
}

После отладки я пришел к выводу, что код перестает выполняться после инициализации ProcessAdSectionsRssCommand класс (если я создам пустой конструктор, он будет выполнен). К сожалению, у меня нет реальных сообщений об ошибках, я думаю, что какое-то исключение может быть проглочено. Handler класс, насколько я могу судить, никогда не инициализируется.

  • Медиатр версия: 6.0.0
  • .NET код SDK версия: 2.2
  • Версия Microsoft DI (Microsoft.Extensions.DependencyInjection): 2.2.0

Я подозреваю, что это какая-то проблема, связанная с DI + Mediatr. У кого-нибудь есть идеи? Благодарю.

1 ответ

Я думаю, вам не хватает awaitво время звонка Send()метод

Другие вопросы по тегам