我有一個Web溶液(在VS2010):模型,的ViewModels,DTO的在MVC 3應用
Domain
其保持Model
類(經由實體框架映射到數據庫表)和Services
其中(除其他的東西)負責CRUD操作WebUI
它引用域項目
對於我創建的第一頁,我已經使用Domain項目中的Model類作爲Model在我的強類型視圖中,因爲類很小,我想要顯示和修改所有屬性。
現在我有一個頁面,應該只使用相應域模型的所有屬性的一小部分。我通過使用我的Service類中的查詢結果的投影來檢索這些屬性。但我需要項目分成一類 - 這裏來我對解決方案的問題,我能想到的:
我介紹
ViewModels
其住在WebUI
項目和揭露IQueryables
並向EF data context
從服務WebUI項目。然後我可以直接投影到這些ViewModels。如果我不希望暴露IQueryables,我把
ViewModel
類的Domain
項目的EF數據上下文,那麼我可以返回的ViewModels直接從服務類的查詢和預測的結果。除了
ViewModels
在WebUI
項目中,我介紹Data transfer objects
來自於服務類的ViewModels
查詢移動數據。
解決方案1和2看起來像工作量相同,我傾向於選擇解決方案2以將所有數據庫問題都保留在單獨的項目中。但不知何故,在Domain項目中有查看-Model。
由於我有更多的類來創建和關注Model-DTO-ViewModel映射,因此解決方案3聽起來更多的工作。我也不明白DTO和ViewModels之間會有什麼區別。 ViewModel不是我想要顯示的Model類的選定屬性的集合嗎?他們不會包含與DTO相同的成員嗎?我爲什麼要區分ViewModels和DTO?
這三種解決方案哪一種更可取,哪些是好處和缺點?還有其他選擇嗎?
感謝您提前反饋!
編輯(因爲我的文字也許太長牆,並已要求代碼)
例子:我有一個Customer
實體...
public class Customer
{
public int ID { get; set; }
public string Name { get; set; }
public City { get; set; }
// ... and many more properties
}
...和想要創建一個只顯示(也許允許編輯)列表中的客戶的視圖。在一個服務I類提取我經投影需要該視圖的數據:
public class CustomerService
{
public List<SomeClass1> GetCustomerNameList()
{
using (var dbContext = new MyDbContext())
{
return dbContext.Customers
.Select(c => new SomeClass1
{
ID = c.ID,
Name = c.Name
})
.ToList();
}
}
}
然後是與動作方法的CustomerController。這應該如何?
無論這種方式(一)...
public ActionResult Index()
{
List<SomeClass1> list = _service.GetCustomerNameList();
return View(list);
}
...或者更好的這種方式(B):
public ActionResult Index()
{
List<SomeClass1> list = _service.GetCustomerNameList();
List<SomeClass2> newList = CreateNewList(list);
return View(newList);
}
對於選項3以上我說:SomeClass1
(生活在Domain
項目中)是DTO和SomeClass2
(生活在WebUI
項目中)是ViewModel。
我想知道區分這兩個類是否有意義。爲什麼我不會總是選擇控制器操作的選項(a)(因爲它更容易)?除了DTO(SomeClass1
)之外,是否有理由引入ViewModel(SomeClass2
)?
您能否發佈代碼? – jfar 2011-05-13 17:51:54
@jfar:現在有一個代碼示例。 – Slauma 2011-05-13 18:33:38
我很好奇 - 你選擇的方法是如何爲你工作的? – kenwarner 2012-01-24 18:55:56