首页 > 解决方案 > 装饰消费者并在消费者(IServiceProvider)中解析服务(masstransit)

问题描述

我正在尝试使用 MassTransit 来实现命令和处理程序 (CQRS) 的中介模式。这有效 - 当一个命令被调度时,正确的处理程序被调用。

现在,我想装饰这些处理程序(不是为了横切关注点,例如日志记录),但我想将装饰器添加到特定处理程序(这样我就可以应用一些权限或授权规则,而无需向处理程序本身添加代码)。这意味着我想用某个函数来装饰命令 A 的处理程序,而不是命令 B 的处理程序。

所以,我想我应该为此使用过滤器。我设法通过使用定义来做到这一点- 所以现在当中介调用具有特定消息类型的特定消费者时,首先调用为其定义的所有过滤器。这很好用。

现在我们来解决问题:我想在过滤器中注入/解析一些服务,因为它们需要访问数据库或进行一些其他验证才能有意义。这就是我卡住的地方。这是上述场景的拉取请求草案:为每个消费者添加过滤器,问题出在此文件中:https ://github.com/bdn-mca/ModularMonolith.Poc/pull/2/files#diff-980261987a7df5d217950a20fccccf88c775bf6c72bf3d536e44d9768b86c51d

我知道 MassTransit 有很多功能,所以我可能做错了什么。

标签: masstransit

解决方案


您可以使用作用域过滤器在运行时从容器中解析过滤器实例。

在您的消费者定义中,只需添加到接收端点配置器:

var csp = _provider.GetRequiredService<IConfigurationServiceProvider>();
cfg.UseConsumeFilter(typeof(DemoValidator<>), csp);

您需要添加IServiceProvider到构造函数定义中,并将其存储在成员变量中以在Configure调用时使用。

文档 样本


推荐阅读