我正在尝试为EventBusRabbitMQ实现配置DI。对于单个交换队列来说,它工作得很好。
services.AddSingleton<IEventBus, EventBusRabbitMQ>(serviceProvider =>
{
...
return new EventBusRabbitMQ(connection, "exchange_EX1", "queue_Q1",..);
});
并在应用程序配置中
var eventBus = app.ApplicationServices.GetRequiredService<IEventBus>();
eventBus.Subscribe<FooEvent, FooEventHandler>;
我想用EventBusRabbitMQ的不同配置注册多个实现,以便在解决IEventBus时可以选择要选择的交换和队列。
我所不希望的是明确实现,因为唯一不同的只是交换和队列。
services.AddSingleton<IEventBus, EventBusRabbitMQ_EX1_Q1>
services.AddSingleton<IEventBus, EventBusRabbitMQ_EX2_Q2>
我有哪些替补?
答案 0 :(得分:0)
我认为,如果您有一套有限的实现,最好的解决方案就是考虑这样的解决方案:
public interface IEventBusRabbitMQ_EX1_Q1:IEventBus
{
}
public interface IEventBusRabbitMQ_EX2_Q2:IEventBus
{
}
然后更改代码以注入正确的实例
services.AddSingleton<IEventBusRabbitMQ_EX1_Q1, EventBusRabbitMQ_EX1_Q1>
services.AddSingleton< IEventBusRabbitMQ_EX2_Q2, EventBusRabbitMQ_EX2_Q2>
但是还有另一种解决方法,描述为here
基本上是一种更丰富的模式,但我不建议这样做,因为它会降低代码的可读性。