У меня проблема с тем, что обработчик команд 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.
Сервер заданий * Метод 1008 * (с кодом 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;
}
}
Команда Mediatr:
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
, насколько я могу судить, никогда не инициализируется.
- Версия Mediatr: 6.0.0
- .NET версия SDK-кода: 2.2
- Microsoft DIверсия (Microsoft.Extensions.DependencyInjection): 2.2.0
Я подозреваю, что это какая-то проблема, связанная с DI + Mediatr.У кого-нибудь есть идеи?Спасибо.