我们正在使用NServiceBus为许多租户执行文档处理。
每个租户都有自己的数据库,我们正在使用NHibernate进行数据访问。在Web应用程序中,我们使用IoC工具(StructureMap)来处理会话管理。基本上我们为每个租户维护一个会话工厂。我们可以从HttpContext
确定租户。
当我们使用NServiceBus启动文档处理时,我们可以访问租户标识符。我们需要在整个文档处理过程中提供此租户ID(我们有2个传真并触发了许多事件)。
我们需要为每个租户创建一个NHibernate SessionFactory
,因此在配置StructureMap时需要一些获取租户ID的方法。
我看过一些帖子建议使用邮件标题来存储租户标识符,但我不确定如何:
SubmitDocumentCommand
)SubmitDocumentCommand
时,它由DocumentSubmissionSaga
处理。如果提交成功,我们将发送DocumentSubmittedEvent
。我们希望确保租户ID在流程中的所有点都可用。我相信通过这些信息,我可以用NHibernate成功实现多租户,但是对于这个场景更具体的内容将不胜感激。
答案 0 :(得分:4)
您可以使用自我注册的消息mutator来传递标头:这是我自己的代码中的一个快速示例。你总是可以使用Bus.CurrentMessageContext.Headers在任何地方设置/获取标题......
希望这会有所帮助:)
/// <summary>
/// Mutator to set the channel header
/// </summary>
public class FlowChannelMutator : IMutateOutgoingTransportMessages, INeedInitialization
{
/// <summary>
/// The bus is needed to get access to the current message context
/// </summary>
public IBus Bus { get; set; }
/// <summary>
/// Keeps track of the channel
/// </summary>
/// <param name="messages"></param>
/// <param name="transportMessage"></param>
public void MutateOutgoing(object[] messages, TransportMessage transportMessage)
{
if (Bus.CurrentMessageContext != null &&
Bus.CurrentMessageContext.Headers.ContainsKey("x-messagehandler-channel"))
{
if (!transportMessage.Headers.ContainsKey("x-messagehandler-channel"))
{
transportMessage.Headers["x-messagehandler-channel"] =
Bus.CurrentMessageContext.Headers["x-messagehandler-channel"];
}
}
}
/// <summary>
/// Initializes
/// </summary>
public void Init()
{
Configure.Instance.Configurer.ConfigureComponent<FlowChannelMutator>(DependencyLifecycle.InstancePerCall);
}
}