2011-05-08 211 views
0

我正在編寫一個利用多租戶的應用程序,如Zack Owens所述。多租戶MVC 3查看模型的應用程序問題

在Zack的例子中,他有單獨的c#類庫來存儲每個租戶的控制器和視圖。由於我沒有使用編譯視圖的Spark View引擎,因此這不是一個選項。相反,我爲每個租戶創建了一個獨立的MVC3應用程序項目,並且在那裏存儲內容,控制器,視圖等。

我有一個自定義控制器工廠的主MVC App項目(這是啓動應用程序)它掃描與Zacks示例相似的程序集,並使用結構圖設置依賴注入。我有一個視圖引擎,它使用控制器上下文來獲取正確的視圖。如果它在租戶應用程序中找不到視圖或依賴項,它將使用我們的主MVC應用程序項目中的視圖或依賴項。除了viewmodels之外,一切都很棒。

我們大部分(如果不是全部)視圖都通過了視圖模型。我希望View Model類駐留在租戶應用程序項目中,而不是在主應用程序項目中,因此租戶可以使自定義視圖模型與自定義視圖一起使用。

它似乎會工作,但我不斷收到錯誤。

場景#1 - 默認的視圖模型駐留在主MVC應用程序項目中。租戶應用程序具有對主應用程序的引用,因此可以使用默認的查看模型。沒問題。現在,當我想添加視圖模型或覆蓋視圖模型時,我創建了該類並將其放入租戶應用程序中。問題在於,當您調用頁面時,主MVC應用程序無法找到新的查看模型,因爲沒有從主應用程序到租戶應用程序的引用,並且它們不能歸因於循環引用問題。

場景#2 - 我將租戶應用的引用從主應用移除。然後,我將默認視圖模型從主應用程序複製到租戶應用程序,更改命名空間並創建從主應用程序到租戶應用程序的引用,以便主應用程序可以訪問視圖模型類。

我然後運行它,並收到以下錯誤:

傳遞到字典的模型產品類型「Sample.Models.Login」,但這部詞典需要類型「Sample.Models的模型項目。登錄'。

錯誤是有道理的,但不是真的。我只有一個名爲Sample.Models.Login

我有一些假設,爲什麼這可能會這樣做,但我不明白。任何提示或建議將不勝感激。

謝謝你

+0

僅供參考,您可以編譯您的觀點。右鍵單擊項目以卸載它,然後右鍵單擊編輯它,然後將第一組中的最後一項(MvcBuildViews)設置爲true而不是false。保存並重新加載項目並編譯。 – 2011-05-08 22:16:03

回答

0

不知道我明白,但我會去的。

首先,如果你需要有不同的視圖模型,你應該有不同的控制器/動作。也許你只是想添加一些額外的信息 - 在這種情況下,自定義視圖模型應該基於原始視圖模型。通過將主視圖模型移動到單獨的程序集中,您可以獲得循環引用問題。您還可以通過使用插件框架(如託管擴展性框架)來管理參考問題。

但是,對於任何給定的控制器/操作,視圖主要部分的數據要求應該相當穩定,無論租戶如何。如果它需要不同的數據,它可能不會做相同的事情,應該採取不同的行動。

也就是說,一個房客可以在每個頁面的頂部放置一個迷你籃子,而其他房客則不會,所以您會認爲他們需要自定義視圖模型來包含籃子數據。然而,更好的方法是修改該租戶的母版頁,例如(在Razor中)包含對@ Html.RenderAction(「minibasket」)的調用,並且該操作將負責獲取額外的購物籃數據。另外,如果你想像亞當建議的那樣編譯你的視圖,那麼另外一個選擇就是看RazorGenerator