2011-06-22 50 views
7

從內到外,這些都是我們的MVC應用程序層:ASP.NET MVC:你在哪裏爲視圖組裝視圖模型?

  1. MS SQL /表/視圖/存儲的特效
  2. 實體框架4.1(ORM)與POCO代
  3. 服務(檢索)和控制功能(保存)
  4. 路由 - >控制器 - > Razor視圖
  5. (客戶端)的JQuery Ajax和Knockout.js(MVVM)

一切都很好,直到我需要創建第5步單一視圖模型來養活兩個Razor視圖以及在JSON /淘汰賽視圖模型:

  • 頭,包括所有下拉列表中選擇和選擇的下面
  • 項目領域 - 無論我們發送到成爲視圖模型

因爲控制器將無法獲得直接存儲庫中的客戶端的數組,這是否意味着我創建的每個服務一個nd每個視圖允許編輯內容?我需要從存儲庫中獲取POCO,並根據需要爲每個字段類型獲取所有選項。

爲每個視圖創建單獨的服務似乎是多餘的。例如,一個viewModel編輯一個地址和一個單獨的viewModel來編輯一個也有地址的房地產屬性。我們可以有十幾個表單編輯相同的地址POCO。

爲了讓這個問題更容易回答,是否允許Controller直接訪問存儲庫泄漏的抽象?

+0

你在享受淘汰賽嗎?我一直想找到一個使用它的理由,而且從來沒有。 –

+0

@nathan你應該結帳這個視頻http://channel9.msdn.com/events/mix/mix11/frm08。這將有助於找到使用它的理由。它將代碼減少到大約一半。 –

回答

1

那麼,您的控制器也會有將POCO從實體框架轉換爲單獨的視圖模型對象的代碼?

如果是這樣,那麼你應該將該代碼移動到一個單獨的類,並遵循單一責任原則。無論該課程是在「服務層」還是非由您決定。並且您是否使用AutoMapper取決於您。但這些data mappers不應該是控制器邏輯的一部分;控制器應儘可能愚蠢。好吧,現在讓我們忽略數據映射問題,並假裝您始終可以將POCO直接用作視圖模型。然後,你會仍然希望有一個服務層,因爲它會

之間

userService.GetByUserName("bob") 
在啞控制器通過返回

userRepository.Users.Single(u => u.UserName == "bob") 


把這些一起平移,並實現在一個特定的方式,您的 UserController最終取決於 IUserServiceIUserDataMapper的依賴關係,並且代碼超乎想象:

public ActionResult ShowUserPage(string userName) 
{ 
    var user = userService.GetByUserName(userName); 
    var viewModel = userDataMapper.MakeViewModel(user); 

    return View(viewModel); 
} 

您現在可以測試控制器是否存在兩個依存關係的存根,或者在模擬IUserService時存留IUserDataMapper,反之亦然。你的控制器邏輯很少,並且has only one axis of change。用戶數據映射器類和用戶服務類也可以這樣說。


我今天早上在讀一篇文章,您可能會發現這些建築問題有點亮。它有點令人不快,題爲「Software Development Fundamentals, Part 2: Layered Architecture」。您可能無法從數據庫應用程序模型切換到文章描述和建議的持久無關模型。但它可能會指向你正確的方向。

+0

這就是我錯過的部分,將從實體集合創建視圖模型的機制中獲取實體的服務分開。我假設'userDataMapper.MakeViewModel'能夠在數據庫中查詢下拉列表的可能選項,例如放置在viewModel的標題中? –

+0

那麼,這取決於---你是否希望能夠在沒有實時數據庫的情況下單元測試你的數據映射器?如果是這樣,那麼數據映射器可能應該注入某種「IOptionsConfiguration」或「IOptionsRepository」。然後,數據映射器中的相關代碼變成只是'options.GetUserTypes()'或其他任何東西,並且您的測試可以根據需要存儲該接口。 – Domenic

0

我個人總是將存儲庫/存儲庫注入控制器。我不知道爲什麼你想要在存儲庫和控制器之間有一個服務層。如果有的話你會使用規格。

一旦你這樣做,檢查出automapper。它的一個映射器,一旦配置正確,就可以將您的域模型映射到您的視圖模型,然後再返回。

+0

小心,您提到的規範使我認爲您正在談論_Domain Driven Design_存儲庫,而OP的問題似乎表明他主要與貧血DTO層和企業應用程序體系結構_存儲庫概念工作。 – Domenic