【发布时间】:2019-12-30 09:41:44
【问题描述】:
RabbitMQ 在收到消息时公开一个AsyncEventingBasicConsumer.Received EventHandler。
因为这是一个顶级事件,所以没有可用的依赖注入,除非为它创建了一个特定的范围并作为封闭变量传递。
#pragma warning disable CA2000 // Dispose objects before losing scope
var serviceScope = this.serviceProvider.CreateScope();
#pragma warning restore CA2000 // Dispose objects before losing scope
consumer.Received += async (object sender, BasicDeliverEventArgs eventArgs) =>
{
try
{
// Do something
}
finally
{
scope.Dispose();
}
}
有没有更好的方法来处理像这样的顶级事件的 DI?
【问题讨论】:
-
当您说“更好的方法”时,问题是“比什么更好?”你想在这里做什么,为什么需要在这个特定位置注入依赖项?
-
我想知道在我的事件处理程序中是否存在使用注入服务的已知模式。这个解决方案在我看来更像是一种“黑客”,而不是一种将服务注入我的事件处理程序的真正方法。但是,按照我的事件处理程序内部的建议创建一个新的复合根并非易事。我还没想好怎么做。
-
使用 DI 的原因是为了支持代码的可测试性。测试匿名函数是困难的或不可能的。因此,DI 在这里没有合法目的。这就是我试图了解你在做什么的原因。
标签: c# dependency-injection .net-core rabbitmq