2012-03-13 124 views
0

我必須逐步替換ASP.NET Web Forms應用程序與ASP.NET MVC3分層應用程序。我們只考慮存儲庫圖層。如何在ASP.NET MVC中爲數據庫視圖建模MVC

在我的新MVC應用程序我有數據(名稱MVC.Data),一個用於網絡一個項目。

MVC.Data我有一個EDMX文件與EF類,模型只是數據庫表(無意見),和程序存儲庫類myRepository其中規定執行簡單的查詢方法。

在舊的Web Forms應用程序中,我有一個GridView,它使用DataSource填充爲SQL數據庫視圖。

爲了在我的新MVC3應用程序相同的結果,我有兩個選擇:

1)創建一個服務層(和項目MVC.Services),在那裏我有,填補了一類新的方法myViewClass其中包含SQL DB視圖的所有字段並將其提供給控制器。

2)在MVC.Data項目中創建一個類,該類由其構造函數直接使用LINQ語句直接對EF類進行填充。

我看了一下工廠模式和第一解決方案似乎是最合適的,但許多人總是建議不要創建服務層如果不需要它。這種情況下最好的選擇是什麼?

回答

1

實際上建立視圖模型應該在映射層完成。基本上,你的控制器動作可能是這樣的:

public ActionResult Index() 
{ 
    SomeDomainModel model = repository.GetSomeDomainModel(); 
    SomeViewModel vm = Mapper.Map<SomeDomainModel, SomeViewModel>(model); 
    return View(vm); 
} 

視圖模型在MVC項目中定義,因爲它是專爲滿足給定觀的要求的一類。

我在回答中顯示的Mapper.Map<TSource, TDest>方法來自我在項目中使用的AutoMapper,但您可以定義任何自定義映射圖層。

映射層也必須是MVC項目的一部分,因爲它必須瞭解域模型和視圖模型以執行映射。

就服務層而言,如果您有一些可能由多個簡單存儲庫調用組成的複雜業務操作,則可以使用它。但有些人可能會爭辯說存在服務層。我認爲這兩種方法都有其優點和缺點,在設計系統時必須進行評估,最重要的是要考慮到您正在設計的具體環境和情景。

+0

謝謝。其實我的意思不是ViewModel本身,而是之前的一步。我有一個ProductId表字段的產品,其他字段作爲其他表的外鍵。我必須創建一個Product類,其中所有外鍵都由該表的字段名稱替換 – CiccioMiami 2012-03-13 16:48:48

+0

我明白了。我很困惑你在服務層中使用的名字myViewClass。那麼在這種情況下,將會將您的傳輸實體(因爲它們不再是域實體)聚合到真實域對象中的服務層可能是一條可行的路。 – 2012-03-13 16:50:16

+0

我問這個是因爲我看了MVC店面視頻,它直接在由模型獲取的信息組成的Repository中使用一個類。我想它只是繞過服務層 – CiccioMiami 2012-03-14 09:15:33