我正在将MassTransit与Autofac结合使用,并且需要一种查询租户ID的入站消息的方法,该方法将用于动态构造连接字符串。因此,逻辑步骤如下:
消息使用者由容器解析,该容器使用按消息范围划分的组件相应地构造依赖关系。
MassTransit有一个有关如何创建消息筛选器here的示例。乍看之下,这似乎是一个潜在的解决方案,但似乎没有使用与解析每个消息的使用者相同的生存期范围来解析消息过滤器的新实例。
所以我的问题是:邮件过滤器可否用于此目的?如果是这样,请提供一个示例或指向一个显示类似内容的示例(例如,使用支持支持访问每个消息生存期资源范围的DI容器的任何内容)。如果不是,那么使用MassTransit满足这种需求的预期方式是什么?
基于查看代码,您应该能够在ILifetimeScope
级别创建一个新的ConsumeContext
,并且它将由使用者使用。下面包括过滤器逻辑的示例。
public class LifetimeScopeFilter :
IFilter<ConsumeContext>
{
LifetimeScopeFilter(ILifetimeScope mainScope)
{
_mainScope = mainScope;
}
public void Probe(ProbeContext context)
{
var scope = context.CreateFilterScope("lifetimeScope");
}
public async Task Send(ConsumeContext context, IPipe<ConsumeContext> next)
{
ILifetimeScope scope = null;
try
{
context.GetOrAddPayload<ILifetimeScope>(() => scope = _mainScope.BeginLifetimeScope())
await next.Send(context).ConfigureAwait(false);
}
finally
{
scope?.Dispose();
}
}
}