asp.net – 模型,ViewModels,MVC 3应用程序中的DTO
我有一个Web解决方案(在VS2010中)有两个子项目:
>持有Model类的域(通过实体框架映射到数据库表)和服务(除了其他东西)负责CRUD操作 对于我创建的第一个页面,我已经使用了Domain项目中的Model类,直接作为我强类型视图中的Model,因为类很小,我想显示和修改所有的属性。 现在我有一个页面,只能使用相应域模型的所有属性的一小部分。我通过在我的Service类中使用查询结果的投影来检索这些属性。但是我需要投入一个类型 – 这里有我可以想到的解决方案的问题: >我介绍了现在在WebUI项目中的ViewModels,并将IQueryables和EF数据上下文从服务公开到WebUI项目。然后我可以直接投入这些ViewModels。 解决方案1和2看起来像同样的工作量,我倾向于倾向于将所有数据库问题保留在单独的项目中。但是不知何故在域项目中有View-Models是错误的。 解决方案3听起来像更多的工作,因为我有更多的类创建和关心Model-DTO-ViewModel映射。我也不明白DTO和ViewModels之间的区别是什么。 ViewModel不是我想要显示的我的Model类的选定属性的集合吗?它们不会包含与DTO相同的成员吗?为什么要区分ViewModels和DTO? 这三种解决方案中的哪一种是优选的,有什么好处和缺点?还有其他选择吗? 感谢您提前收到意见! 编辑(因为我可能有一个太长的文本墙,并被要求代码) 示例:我有一个客户实体… public class Customer { public int ID { get; set; } public string Name { get; set; } public City { get; set; } // ... and many more properties } …并且想要创建一个仅显示(并且可能允许编辑)列表中的客户名称的视图。在一个服务类中,我通过投影来提取我需要的数据: 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。这怎么样? 这样(a)… 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)吗? 解决方法
很难遇到这样的问题,您很快就会遇到使用EF尝试“展平”模型的问题。当我有一个如下所示的CommentViewModel类时,我遇到类似的东西: public class CommentViewModel { public string Content { get; set; } public string DateCreated { get; set; } } 以下EF4查询投影到CommentViewModel将不会像couldn’t translate the ToString() method into SQL: var comments = from c in DbSet where c.PostId == postId select new CommentViewModel() { Content = c.Content,DateCreated = c.DateCreated.ToShortTimeString() }; 使用像Automapper这样的东西是一个不错的选择,特别是如果你有很多转换。但是,您也可以创建自己的转换器,基本上将您的域模型转换为视图模型。在我的情况下,我创建了我自己的扩展方法,将我的Comment域模型转换为我的CommentViewModel,如下所示: public static class ViewModelConverters { public static CommentViewModel ToCommentViewModel(this Comment comment) { return new CommentViewModel() { Content = comment.Content,DateCreated = comment.DateCreated.ToShortDateString() }; } public static IEnumerable<CommentViewModel> ToCommentViewModelList(this IEnumerable<Comment> comments) { List<CommentViewModel> commentModels = new List<CommentViewModel>(comments.Count()); foreach (var c in comments) { commentModels.Add(c.ToCommentViewModel()); } return commentModels; } } 基本上我做的是执行标准的EF查询来带回一个域模型,然后使用扩展方法将结果转换为视图模型。例如,以下方法说明了用法: public Comment GetComment(int commentId) { return CommentRepository.GetById(commentId); } public CommentViewModel GetCommentViewModel(int commentId) { return CommentRepository.GetById(commentId).ToCommentViewModel(); } public IEnumerable<Comment> GetCommentsForPost(int postId) { return CommentRepository.GetCommentsForPost(postId); } public IEnumerable<CommentViewModel> GetCommentViewModelsForPost(int postId) { return CommentRepository.GetCommentsForPost(postId).ToCommentViewModelList(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何组合WebResource.axd和ScriptResource.axd文
- asp.net-membership – 将ASP.NET成员资格提供程
- asp.net-mvc – 如何在vbhtml razor文件中正确执
- asp.net-mvc – 查看模板代码标签 – asp.net mv
- asp.net-mvc – 在Visual Studio中快速浏览ASP.N
- asp.net – visio服务器端自动化的替代方案
- 将变量从ASP.net传递给JavaScript
- asp.net – App_Data / ASPNETDB.MDF到Sql Serve
- 双重登录ASP.Net WebForms应用程序的一些用户
- ASP.NET UpdatePanel库引用错误