Мы создаем платформу микросервисов, которая будет принимать трафик API REST и обрабатывать сообщения из внутренней асинхронной очереди для межконтейнерной связи.
Мы используем встроенное внедрение зависимостей для контроллеров, и это хорошо работает, но мне интересно, как управлять внедрением зависимостей для асинхронных очередей.
Вот что у меня сейчас есть:
При запуске
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
new QueueSubscriber().SubScribe<MessageHandler>();
}
Абонент
public void Subscribe<T>()
{
Task.Run(() => Poll<T>());
}
private async Task Poll<T>()
{
// Polling logic here
// Found message
Task.Run(() => CallHandler<T>()
}
public async Task CallHandler<T>()
{
// I want to inject dependencies here
var handler = Activator.CreateInstance(typeof(T)) as IMessageHandler<T>;
await handler.HandleMessage();
}
Я не могу найти что-либо о возможности использовать доступное внедрение зависимостей, которое предоставляется с помощью services.AddSingleton<IDependency, Dependency>();
Я вижу реализацию шаблона IHostedServices, но это не позволит мне внедрить зависимости в новые экземпляры обработчиков сообщений
РЕДАКТИРОВАТЬ: Вот то, что я сейчас имею, создавая экземпляр обработчика сообщений и передавая его, хотя не уверен, что это лучший способ.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IDependency dependency)
{
new QueueSubscriber().SubScribe(new MessageHandler(dependency);
}
Абонент
public void Subscribe<T>(IMessageHandler<T> handler)
{
Task.Run(() => Poll(handler));
}
private async Task Poll<T>(IMessageHandler<T> handler)
{
// Polling logic here in while loop
// Found message
Task.Run(() => CallHandler(handler)
}
public async Task CallHandler<T>(IMessageHandler<T> handler)
{
await handler.HandleMessage();
}