NServiceBus,NHibernate和Multitenancy

时间:2013-08-19 16:52:08

标签: nhibernate structure nservicebus multi-tenant

我们正在使用NServiceBus为许多租户执行文档处理。

每个租户都有自己的数据库,我们正在使用NHibernate进行数据访问。在Web应用程序中,我们使用IoC工具(StructureMap)来处理会话管理。基本上我们为每个租户维护一个会话工厂。我们可以从HttpContext确定租户。

当我们使用NServiceBus启动文档处理时,我们可以访问租户标识符。我们需要在整个文档处理过程中提供此租户ID(我们有2个传真并触发了许多事件)。

我们需要为每个租户创建一个NHibernate SessionFactory,因此在配置StructureMap时需要一些获取租户ID的方法。

我看过一些帖子建议使用邮件标题来存储租户标识符,但我不确定如何:

  1. 首次提交文档(发送SubmitDocumentCommand
  2. 时设置邮件标题
  3. 配置StructureMap时引用标题
  4. 访问我们的传奇/处理程序中的标题
  5. 确保标题从一条消息流向下一条消息。当我们发送SubmitDocumentCommand时,它由DocumentSubmissionSaga处理。如果提交成功,我们将发送DocumentSubmittedEvent。我们希望确保租户ID在流程中的所有点都可用。
  6. 我相信通过这些信息,我可以用NHibernate成功实现多租户,但是对于这个场景更具体的内容将不胜感激。

1 个答案:

答案 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);
    }
}