2010-01-25 153 views
4

的設置公共數據:(使用Asp.Net MVC 2 RC,實體框架,SQL服務器,VS2008)Asp.Net MVC - 所有控制器

我的朋友和我的工作的一個項目,將有不同的指向它的域名。我們希望從請求中獲取域(網站)並使用它來驅動數據。這個網站數據需要成爲所有控制器的一部分。

Ex。 domain1.website.com的數據將爲 與 domain2.website.com的數據不同,而那些數據將不同於website2.com的數據。 該網站的外觀與 相同,但數據不同。

我設置了一個BaseController,它的所有其他控制器都從它繼承而來。但我不喜歡它。

BaseController:

public class BaseController : Controller 
{ 
    private Website _website; 
    private readonly IWebsiteRepository _websiteRepository; 

    public BaseController(IWebsiteRepository websiteRepository) 
    { 
     _websiteRepository = websiteRepository; 
    } 

    public Website CurrentWebsite { get; } 
} 

的問題,這是我現在需要一個IWebsiteRepository傳遞給我的每一個控制器的基礎:

public class BioController : BaseController 
{ 
    private readonly IBiographyRepository _bioRepository; 

    public BioController(IBiographyRepository bioRepository, IWebsiteRepository websiteRepository) 
     : base(websiteRepository) 
    { 
     _bioRepository = bioRepository; 
    } 
} 

這裏是我的問題

  1. 有沒有更好的方法來處理多個域名bei ng指向一個項目並過濾數據?
  2. 有沒有更好的方法讓每個控制器中的網站對象?

UPDATE

對不起,我忘了補充一點,我已經使用IOC(結構圖)。我的問題是沿的線條更:

  1. 我應該用別的東西代替BaseController? ActionFilter?
  2. 有沒有辦法設置它,所以我不必將IWebsiteRepository傳遞給基類?
  3. 有沒有更好的方式來處理用於數據的域?

回答

1

我其實很喜歡通過構造函數注入來注入庫的想法。這將使測試控制器變得更容易,因爲您可以簡單地傳入模擬庫。另一種方法是使用靜態工廠類從請求中獲取存儲庫,但使用靜態類會使單元測試更難。

我會做的一個改進是爲您的控制器使用缺省構造函數,該構造函數使用空值參數調用構造函數。在帶有參數的構造函數中,如果提供的參數爲null,則實例化正確的存儲庫。這樣你就不需要實現一個控制器工廠來建立控制器的參數;默認的控制器工廠可以使用無參數構造函數,您仍然可以從構造函數注入中獲益。

public BaseController() : this(null) { } 

public BaseController(IWebsiteRepository websiteRepository) 
{ 
    this._websiteRepository = websiteRepository ?? new WebsiteRepository(); 
}