2013-08-19 54 views
1

我們使用NServiceBus爲多個租戶執行文檔處理。NServiceBus,NHibernate和Multitenancy

每個租戶都有自己的數據庫,我們使用NHibernate進行數據訪問。在Web應用程序中,我們使用我們的Io​​C工具(StructureMap)來處理會話管理。基本上我們爲每個租戶維護一個會話工廠。我們能夠從HttpContext中識別租戶。

當我們啓動使用NServiceBus的文檔處理時,我們可以訪問租戶標識符。我們需要這個租戶ID在整個文檔處理過程中可用(我們有2個傳說並且關閉了一些事件)。

我們需要爲每個租戶創建一個NHibernate SessionFactory,因此當我們配置StructureMap時需要某種方式來獲得租戶ID。

我見過幾個職位建議使用郵件標題來存儲租戶標識符但我不確定如何:

  1. 設置郵件頭,當我們第一次提交的文件(發送SubmitDocumentCommand
  2. 參考,當我們配置我們的傳奇/處理器
  3. 內StructureMap
  4. 訪問頭確保頭從一個消息流到下一個標題。當我們發送SubmitDocumentCommand時,它由DocumentSubmissionSaga處理。如果提交成功,我們將發送DocumentSubmittedEvent。我們希望確保租戶ID在此過程中的所有點都可用。

我相信有了這些信息,我可以用NHibernate成功地實現多租戶,但任何更具體的這種情況下,將不勝感激。

回答

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); 
    } 
} 
+0

這幫助了很多。一旦我們有了TenantId,我們就可以配置StructureMap來獲得相關的'SessionFactory'來處理這個調用。 –