我們使用NServiceBus和Ninject來實現多租戶SaaS應用程序。NServiceBus和Ninject - 訪問NSB消息屬性
當用戶訪問我們的網站或API時,我們可以通過檢查HttpContext請求對象的主機名來確定用戶連接到哪個帳戶,檢索有關帳戶的各種設置(其中之一是我們應該使用的數據庫連接到),其餘請求連接到正確的數據庫(進行各種其他檢查)。
在我們的NSB Windows服務,我們沒有一個共享的情況下,使我們能夠確定主機數據庫連接的那個概念,所以我們創建存放帳戶/數據庫對我們的基本命令類的屬性誰創建了命令/消息。
當爲傳入消息構造消息處理程序時,其中一個依賴項是一個存儲庫,該存儲庫將它應該連接到的數據庫的名稱作爲參數。
正如之前所說,Ninject能夠訪問正確的數據庫中的HttpContext Web請求,但爲NSB服務本身包含我們只能在處理後接入構造,這顯然失敗了DB細節的消息,因爲它需要一個參數(包含在消息中!)成功構建存儲庫。雞和蛋:)
這是問的長篇大論方式...
- 反正是有在Ninject創建週期內訪問消息的屬性?
- 這感覺就像是那些難以解決的難題之一,因爲我的架構「錯誤」,是這樣嗎?
- 我想避免在「SetDatabase」這樣的資源庫上放置公共屬性,因爲這樣可能會很容易被濫用/誤解並導致用戶數據混亂。
- 我也想過創建一個存儲庫工廠,Ninject會使用但仍不知道如何訪問傳入消息屬性。
在此先感謝!
編輯爲解決
我結束了使用從烏迪和埃本答案的混合方法。
我對我的API消息使用了出去消息增發器,它將客戶的賬戶名添加到出站消息的頭文件(來自HttpContext)。 然後,在NSB Windows服務中,我使用一個入站增強器來檢查標題並提取帳戶名稱,如Udi所示。
我還創建了一個接口的實例,該接口爲Eben提供的連接字符串/帳戶詳細信息提供給我的存儲庫。一個用於web請求,一個ThreadStatic類型由傳入的mutator設置,然後Ninject綁定用於NSB的repo實例化。
我不能標記既是正確的,對不起埃本!:)
我有一個類似的架構,以及類似的問題。你是如何配置你的容器註冊以從入站消息變更器中獲取租戶的?你能分享一些代碼嗎? – Junto