我正在nservicebus 7
应用程序中使用asp.net core 2.1
。
我想在处理程序函数之外(特别是在存储库类中)访问我的自定义消息头。
this blog post,但无论如何这两种方法都不适合我。每当我尝试访问ContextAccessor.get
时,都会返回空引用。
任何想法都可能是错误的,或者有其他方法可以访问处理程序函数外部的IMessageHandlerContexts
。
答案 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