2012-04-24 132 views
0

我有一個viewmodel可以在控制器,視圖和核心中使用。核心是一個獨立的項目,而控制器和視圖在Web項目中。放置ViewModel的最佳位置在哪裏,它是在Web項目還是在Core中,還是我需要爲View Model創建一個單獨的項目?在哪裏把ViewModel

回答

0

視圖模型通常是包含具有UI格式數據的模型的包裝。您可能應該將模型類保留在Web項目中的Core項目和視圖模型類中。

您的View Model類的構造函數可以接受模型類(以及任何其他需要填充視圖的對象)的實例並生成正確的視圖數據。例如,如果你的模型有一個DateTime對象,那麼你的視圖模型可以有一個相應的String屬性,它包含你想要顯示的格式的DateTime。

+0

那麼如何在覈心中使用視圖模型?我需要參考Web項目類嗎? – user335160 2012-04-24 03:29:10

+0

反過來。 Web項目引用您的核心項目。我已經更新了我的答案 – 2012-04-24 04:59:39

+0

好吧,我現在很困惑,因爲我使用了自動映射器來映射ViewModel和Model。如果我在構造函數中實例化模型,似乎我不需要Automapper? – user335160 2012-04-24 05:48:20

0

由於ViewModel特定於視圖,我通常會在我的UI項目下創建一個ViewModel文件夾並將其保留在那裏。

enter image description here

我將爲我的ViewModels和實體模型之間的橋接數據一個單獨的服務層(另一個項目)。我的Controller Action方法使用ViewModel對象調用服務層。

+0

其實我們有相同的設計,你可以給我一個你的服務層和控制器的示例代碼,返回一個ViewModel?對我來說正確理解。 – user335160 2012-04-24 03:47:57

1

我有一個viewmodel可以在控制器,視圖和核心中使用。

不,你沒有在Core中使用它。谷歌「分離關注」。視圖模型的責任是在視圖中表示模型(核心項目)。它不應該用於其他任何事情。我在這裏寫了關於視圖模型的文章:http://blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/

控制器的責任是從模型(核心 項目)中獲取所有內容並創建適當的視圖模型。

將視圖模型置於某處,以便它可以在Core中使用,這讓它有一個以上的理由來改變這將破壞單一責任原則(五種SOLID原則之一)。這意味着應用程序的多個部分會受到您所做的每一項更改的影響,並且可能會導致小的解決方法或快速修復,這會在一年內給您帶來維護噩夢。

更新

實施例使用AutoMapper:

public class FlairController 
{ 
    public FlairController(IYourServiceOrRepository repos) 
    { 
    } 

    public ActionResult Details(int id) 
    { 
     SomeCoreObject entity = _repos.Get(id); 
     FlairViewModel model = new FlairViewModel(); 
     Mapper.Map(entity, model); 
     return View(model); 
    } 
} 

你的示例代碼(在評論)是如何該方法看起來像未經映射框架。

+0

這裏是我的項目結構 網站 - 查看 控制器 - 所有控制器都在這裏(如果我將它放在這裏,會感到困惑) Core-包含自動映射器配置,映射器類,ModelView映射和服務(ViewModel正在使用此處返回我需要的數據) DataAccess-存儲庫類 Model-generated by EF – user335160 2012-04-24 06:27:37

+0

視圖模型和核心模型之間的視圖模型和自動映射器配置應放置在UI(MVC3項目)中,因爲Core不應該知道任何東西在UI層。您的服務不應該使用視圖模型,因爲它們專門用於顯示HTML – jgauffin 2012-04-24 06:55:01

+0

您能否請您在這裏提供一個關於您提到的方法的示例代碼,實際上我現在非常困惑,因爲我正在考慮您所說的是,你的控制器有此示例代碼返回查看( 視圖, 新FlairViewModel { 晚餐= dinners.ToList(), LOCATIONNAME = string.IsNullOrEmpty(location.City) 「你」:?的String.Format(「{ 0},{1}「,location.City,location.RegionName) } ); – user335160 2012-04-24 08:22:39