DTOs如何融入MVC应用程序的仓储库+服务模式?

3
我已经学习了约一个月的MVC,从我的理解来看,一种很好的应用程序架构方法是:MVC <> Service <> Repository <> Core。
在MVC中,我们有Views和Controllers来为控制器填充ViewModels。我的问题是:数据传输对象(DTO)到底是在哪里使用?我正在构建一个单页Web应用程序,我想从一开始就做正确。
从我所阅读的内容来看,我应该在将Model对象传递到ViewModel之前使用DTO来“扁平化”它们。它们是否作为一个“只包含所需数据”的对象,从服务传递到控制器,然后构造ViewModels?如果是这样,通常情况下每个模型定义(如Sets、Cards、Users)应该在Core层中具有相应的DTO类吗?任何澄清都会很棒,感谢您的时间!

相关:DTO = ViewModel? - Tim M.
那个回答将DTO和View Model描述为完全不同的概念,在Silverlight/MVVM中是正确的。在Asp.Net MVC中,这些概念实际上非常相似。 - Felipe Castro
@FelipeCastro - 我认为那个问题的答案(特别是被接受的答案)给出了一定程度的观点。这部分是一个语义讨论,即术语如何定义以及人们如何理解它们,我大部分同意DTO与ASP.Net MVC中的ViewModel非常相似。这种相似性并不意味着它们可以互换,但往往可以直接将模型投影到ViewModel中,从而轻松消除DTO的需求。 - Tim M.
1个回答

4
首先,谈到这个短语:“一种相当不错的应用架构方式是...”:我不相信有一种适合所有应用程序的单一架构方式,而且我更喜欢始终使用最简单的方法(即较少的层)来解决手头的问题。
当你说“Service”时,它似乎是整个Web服务层,而不仅仅是一些领域服务类;在我看来,大多数情况下,在Asp.Net MVC中,控制器本身就可以扮演服务的角色,从而消除了添加另一层的需求。当然,也有例外情况,请确保您增加复杂性的原因是合法的。
关于DTO和View Model:如你所描述的,DTO会展开对象模型并返回“我需要的数据”。DTO是一个更通用的术语,通常用于Web服务,您不知道谁是消费者。View Model是DTO的一种更专业的类型,它返回“仅视图需要的数据”。因此,如果您不需要额外的服务层,则也不需要额外的DTO层,只需使用View Model将域类直接展开并从控制器返回即可。
实际上,对于非常简单的应用程序,甚至将Model x ViewModels分开是过度设计——可以使用单个Model层来完成两个角色,并借助ViewBag来实现。我不知道您的要求,因此无法确定哪种方式对您更好。
最后一条评论:如果您必须构建单页面应用程序,则Asp.Net MVC不是最佳工具。我建议在服务器端使用Asp.Net Web Api(仅服务,无视图)以及客户端的mvc框架,如BackboneJs或AngularJs。

+1 是指“您不需要额外的DTO层”,并提到了WebApi。我认为您应该小心使用“单个模型层”概念。这里有一个很好的、最近的讨论:https://dev59.com/jmUp5IYBdhLWcg3wzpxk#15045645 - Tim M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接