2010-09-08 93 views
3

我正在開發ASP.NET MVC多站點應用程序(可以從同一應用程序實例/多租戶應用程序託管多個站點)。ASP.NET MVC多站點 - 在哪裏存儲站點配置數據

我以前在一個Web表單應用程序中完成了這項工作,並在自定義基頁的page_load事件中加載了相應的站點配置數據(通過檢查url)。

有了ASP.NET MVC,我最好在Application_BeginRequest中做同樣的事情嗎?然後,我可以將配置對象添加到HttpContext.Current.Items。

+0

你是什麼意思的多站點?像一臺機器上的許多客戶一樣?許多域名,一臺服務器? – 2010-09-08 21:53:51

+0

我認爲他意味着一個多租戶應用程序。 – Omar 2010-09-08 21:57:58

+0

我更新了我的問題 - 意識到我有點含糊。基本上這就像Magento Commerce中的多商店功能。 – 2010-09-08 21:58:34

回答

2

我正在做類似於當前正在處理的sytsem的東西。

我determinging由url網站的用戶訪問應用程序,如下所示:

public class BaseController : Controller 
{ 
    protected override void Initialize(RequestContext requestContext) 
    { 
     var host = requestContext.HttpContext.Request.Url.Host; 
     Site = _siteService.GetSiteByHost(host); 

     base.Initialize(requestContext); 
    }  
} 

每個控制器在我的系統擴展BaseController,所以網站對象可用於每個控制器。如果您有任何更具體的問題,請問我會讓你知道我們做了什麼。

upate

你上面看到的是_siteService.GetSiteByHost(host)。 SiteService在它和Repository之間有一個緩存層,它負責處理與緩存相關的所有內容。它被定義爲:

public Site GetSiteByHost(string host) 
    { 
     string rawKey = GetCacheKey(string.Format("GetSiteByHost by host{0}", host)); 

     var site = (Site)_cachingService.GetCacheItem(rawKey); 

     if (site == null) 
     { 
      site = _siteRepository.GetSiteByHost(host); 
      AddCacheItem(rawKey, site); 
     } 

     return site; 
    } 

我們儘量不要除非我們處理的簡單數據類型,像int使用雪村。我不會在Session中存儲一個Site對象,但是我會在會話中存儲一個代表SiteId的int值。然後,下次用戶訪問應用程序時,我可以通過Id從緩存中獲取與當前用戶關聯的Site對象。在上面的情況下,雖然沒有必要。

+0

戴夫,一個問題 - 我假設當你緩存項目或使用會話對象時,你是用站點標識符爲你的密鑰加前綴? – 2010-09-09 11:55:13

+0

我更新了答案以反映您的問題。 – DaveDev 2010-09-09 13:41:10

+0

非常感謝 - 這是有幫助的 – 2010-09-09 19:52:04

2

This blogger有什麼看起來是一個不錯的一系列asp.net-MVC大約多租戶文章

你所提到的聲音就像做你想要什麼的可行的方法,雖然它可能不是成語解。

+0

感謝您的鏈接 - 看起來像它涵蓋了我所需要的。 – 2010-09-08 22:37:09

+0

沒問題...爲自己保存以及:) – 2010-09-08 22:54:19