使用nservicebus在处理程序功能之外访问消息头

时间:2019-06-19 09:24:36

标签: asp.net-core nservicebus

我正在nservicebus 7应用程序中使用asp.net core 2.1

我想在处理程序函数之外(特别是在存储库类中)访问我的自定义消息头。

this blog post,但无论如何这两种方法都不适合我。每当我尝试访问ContextAccessor.get时,都会返回空引用。

任何想法都可能是错误的,或者有其他方法可以访问处理程序函数外部的IMessageHandlerContexts

3 个答案:

答案 0 :(得分:0)

IMessageHandlerContext仅在处理程序内部可用。但是,您可以将它作为参数传递给代码的其他部分。

例如,

public async Task Handle(MyCommand message, IMessageHandlerContext context)
{
     var result = await SomeOtherFunction(message, context).ConfigureAwait(false);
}

您还可以读取处理程序中的标题,并将其仅传递给存储库方法。参见Manipulating message headers。下面的相关部分。

public class ReadHandler :
    IHandleMessages<MyMessage>
{
    public Task Handle(MyMessage message, IMessageHandlerContext context)
    {
        var headers = context.MessageHeaders;
        var nsbVersion = headers[Headers.NServiceBusVersion];
        var customHeader = headers["MyCustomHeader"];
        return Task.CompletedTask;
    }
}

答案 1 :(得分:0)

我认为 IUniformSession 可能会解决您的问题。

我正在研究如何使用 DI 容器注入 IMessageHandlerContext,但它似乎最初是 NServiceBus 团队的设计选择,迫使我们传递这个对象。

那么他们肯定是添加了统一会话功能。

我自己(还)没有使用过它,但我开始相信这是要走的路。

供参考:

答案 2 :(得分:0)

就我个人而言,我会尝试使用管道行为从标头中获取所需的信息。信息可以存储在自己定义的类型中,可以在容器中注册,然后注入到存储库中。这样,您就无需将 IMessageHandlerContext 传递给存储库。

我的一位同事为此提供了一个样本: https://github.com/ramonsmits/NServiceBus.InjectStorageContext/tree/v7