У нас есть сервисное приложение в ядре .net, которое будет работать как демон в среде Linux.Все работает, как ожидалось, но у меня возникли проблемы с обработкой инъекций зависимостей.Ниже приведен код для справки
Program.cs
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("Starting PreProcessor Application ");
try
{
ConfigParameters.LoadSettings(args);
}
catch (Exception ex)
{
Console.BackgroundColor = ConsoleColor.Red;
Console.WriteLine($"Error in setting config parameters {ex.Message}");
return;
}
IHost host = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddLogging();
services.AddHostedService<MainService>();
services.AddTransient<IMessageQueue, ActiveMQHandler>(x =>
{
return new ActiveMQHandler(ConfigParameters.Settings.MessageQueueAddress);
});
services.AddTransient<IMessageQueue, ActiveMQHandler>(x =>
{
return new ActiveMQHandler(ConfigParameters.Settings.MessageQueueAddress);
});
services.AddTransient<IMessageQueue, ActiveMQHandler>(x =>
{
return new ActiveMQHandler(ConfigParameters.Settings.MessageQueueAddress);
});
})
.Build();
await host.RunAsync();
}
}
Конструктор для MainService
выглядит следующим образом
IApplicationLifetime appLifetime;
IConfiguration configuration;
PreProcessorQueueListener listener;
private string reason = "SHUTDOWN SIGNAL";
private IMessageQueue messageQueue;
private IMessageQueue messageQueueSL;
private IMessageQueue messageQueueSLProcess;
public MainService(IConfiguration configuration, IApplicationLifetime appLifetime, IMessageQueue messageQueue, IMessageQueue messageQueueSL, IMessageQueue messageQueueSLProcess)
{
this.configuration = configuration;
this.messageQueue = messageQueue;
this.messageQueueSL = messageQueueSL;
this.messageQueueSLProcess = messageQueueSLProcess;
this.appLifetime = appLifetime;
}
Если вы видите в моем MainService
кодея передаю три экземпляра для IMessageQueue
интерфейса с помощью внедрения зависимости конструктора.То, что я действительно хочу, основано на потребности в любой части приложения, я мог бы получить новый экземпляр класса ActiveMQHandler
, передав интерфейс IMessageQueue
.Так как я не мог найти решение для этого, я пропускаю три случая (я не доволен этим решением) IMessageQueue
.Если мне нужно использовать другой экземпляр класса ActiveMQHandler
, мне нужно будет передать четвертый параметр как IMessageQueue
интерфейс в моем классе MainService
.
Что я действительно ищу, так это использовать ServiceProvider
(или что-то более изящное) и используйте его для получения нового / единственного экземпляра (в зависимости от того, как он определен в Program.cs
) экземпляра класса, который реализует интерфейс IMessageQueue
.
Предложения, ребята ??