我在多租户应用程序中使用Masstransit。在Web Api部分,我使用Owin中间件来解析来自DNS的租户ID。我可以使用OWIN环境从服务中访问它。 我创建了一个Masstransit中间件来拦截消息并获取租户ID。在某些情况下,我需要访问它。 由于总线是单一范围的,我该如何访问它? 我尝试使用IConsumeObserver.PreConsume,在调试中我看到来自消费者的私有属性,但我无法访问它们。
更新: 每条消息都有TenantId属性。我们使用Entity Framework全局过滤器来过滤TenantId的所有查询。它是在我们注入消费者的工作单位上设定的:
public class MyConsumer : IConsumer<IMyCommand>
{
private readonly ITenantConfiguration _tenantConfiguration;
private readonly IUnitOfWork _uow;
public MyConsumer(ITenantConfiguration tenantConfiguration, IUnitOfWork uow)
{
_tenantConfiguration = tenantConfiguration;
_uow = uow;
}
public Task Consume(ConsumeContext<IMyCommand> context)
{
return Task.FromResult(true);
}
}
问题是在从邮件中获取TenantId之前,工作单元已实例化。我使用Ninject,如果我将工作单元设置为.InTransientScope(),它可以解决我的问题。 如果我使用Web Api,我会从Owin Middleware启动类获得tenantId:
var domain = context.Request.Host.Value.ToLower();
context.Set<object>("tenantId", tenantId);
稍后,我可以从服务中访问它:
var owinContext = HttpContext.Current.Request.GetOwinContext();
var owinEnvVars = owinContext.Environment;
var currentTenantInfo = owinEnvVars["tenantId"]
当Masstransit消息时,是否有可能有类似的东西?