2012-06-06 50 views
1

n00b這裏。重新提問,因爲我沒有標記正確。Autofac MultiTenant - 我如何路由到子域?

我想利用Autofac的MutliTenant功能。我從源文件中得到了一個「工作」的例子。我掃描了文檔,無法找出如何「路由」租戶。

目前,我想利用一個基本的CRUD應用程序代碼庫。 CRUD應用程序將被幾個不同的網站使用,只專注於個別網站的特定服務。

我想最終做到這一點:

  • codebase.website1.com(承租人1)
  • codebase.website2.com(承租人2)
  • codebase.website3.com(租客3)

任何想法或參考?謝謝。

+0

此底層CRUD應用程序是否是從不同網站的代碼中調用的單個運行實例?如果是這樣,它的架構是什麼? –

+0

@MarcL。我在想IIS 7.0,Win 2008 R2。是的,單個實例將被網站1或2或3調用。因此,在網站1上,將會有一個鏈接到codebase.website1.com等等。每個用戶都將被認證,但是,基於該網站,所以來自網站2的用戶2無法登錄到codebase.website1.com。我希望這是有道理的。 – REMESQ

回答

1

如果您退房the Autofac multitenant documentation on the wiki您會注意到您確定租戶的方式是實施ITenantIdentificationStrategy。在該wiki頁面上給出了一個示例,其中顯示瞭如何從請求中的參數獲取租戶,如查詢字符串。

很容易修改示例以查看請求的其他部分 - 主機名,域名或其他任何內容。

using System; 
using System.Web; 
using AutofacContrib.Multitenant; 

namespace DemoNamespace 
{ 
    public class DomainStrategy : ITenantIdentificationStrategy 
    { 
    public bool TryIdentifyTenant(out object tenantId) 
    { 
     tenantId = null; 
     try 
     { 
     var context = HttpContext.Current; 
     if(context != null && context.Request != null) 
     { 
      var site = context.Request.Url.Authority; 
      // Here's where you map the site to the tenant ID: 
      tenantId = MapTheSiteToTheTenantId(site); 
     } 
     } 
     catch(HttpException) 
     { 
     // Happens at app startup in IIS 7.0 
     } 
     return tenantId != null; 
    } 
    } 
} 

顯然你需要按摩它才能爲你工作。你是如何做映射的,無論你是否返回null作爲默認租戶ID等等。

請注意,如果您基於HTTP請求值進行測試,則任何時候解析依賴關係並且沒有網絡上下文中,您將獲得應用程序級依賴性,而不是租戶特定的依賴性......因爲您無法識別租戶。您會在catch塊中看到一個很小的工件 - 如果在應用程序啓動時任何依賴項得到解決,則不一定有Web上下文,因此在調用HttpContext.Current時,IIS 7.0會拋出HttpException。你必須測試這樣的東西。

此外,如果服務電話或服務電話昂貴,您將需要考慮租戶ID映射的緩存策略。每次解決多租戶依賴時,策略都會被調用,因此您希望儘可能高效地實施策略。

I would really recommend checking out that documentation.這很長,但這是因爲多租戶是一個複雜的話題,並且有很多理由可以覆蓋。如果你潛入那裏,你會發現這樣的問題的答案。

+0

這是我特別關注的代碼,我想知道如何實現這個策略(wiki特別聲明「只是示例,不建議使用)。雖然我看到你在if語句塊中添加了代碼,但我是一個n00b在這個。你是否推薦這種基於域名的策略作爲聲音?欣賞你的見解。 – REMESQ

+0

是的,我現在開始明白了。 :) – REMESQ

+0

不推薦使用的位是使用查詢字符串參數來切換租戶。這樣做可以讓別人改變他們的查詢字符串並「成爲」不同的租戶。使用主機/域名是不同的,因爲你不能真正搞亂並保持在同一個「站點」 - 就瀏覽器而言,你實際上正在其他地方。 –