如何将DTO融入MVC应用程序的存储库+服务模式?

时间:2013-02-28 03:29:07

标签: asp.net-mvc model-view-controller dto

我大约一个月进入MVC,根据我的理解,应用程序架构的一个很好的方法是:

MVC<>服务<>存储库<>芯

在MVC中,我们有视图和控制器来为控制器填充viewModels。我的问题是:数据传输对象到底在哪里?我正在构建一个单页的Web应用程序,我正在尝试从一开始就做到这一点。

从我已经完成的阅读中,我应该使用DTO来“展平”Model对象,然后再将它们传递给ViewModel。它们是否作为“我需要的唯一数据”对象从服务传递到控制器,此时构建了viewModel?如果是这样,通常每个模型定义(即集合,卡片,用户)在核心层中应该具有相应的DTO类吗?这里的任何澄清都很棒,谢谢你的时间!

1 个答案:

答案 0 :(得分:4)

首先,关于这句话:“应用程序架构的一个非常好的方法是......”:我不相信所有应用程序都有一个好的方法,我宁愿总是使用最简单的方法(即更少的图层)可以解决您手头的问题。

当您说“服务”时,它似乎是一整层Web服务,而不仅仅是一些域服务类;在大多数情况下,我见过Asp.Net MVC,控制器本身可以完成服务的角色,因此无需添加另一层。当然也有例外,只要确保你增加复杂性的理由是合法的。

关于DTO和View模型:与您描述的一样,DTO将展平对象模型并返回“仅我需要的数据”。 DTO是一个更通用的术语,通常用于您不知道谁是消费者的Web服务。想想(Asp.Net MVC)将模型视为一种更专业的DTO,它返回“只有 THE VIEW 需要的数据”。因此,如果您不需要额外的服务层,您也不需要额外的DTO层,只需使用View Models直接展平域类并从控制器返回它们。

事实上,对于非常简单的应用程序,即使是模型x ViewModel的分离也是过度的 - 在ViewBag的帮助下,可以使用单个模型层来实现这两个角色。我不知道你的要求,所以我不能说哪个更适合你。

最后,有一条评论:如果你必须构建单页面应用程序,Asp.Net MVC不是最好的工具。我建议在服务器上使用Asp.Net Web Api(仅限服务,没有视图)和客户端 mvc框架,例如BackboneJs或AngularJs。