如何一起使用DTO和ViewModel?还是不可能?

时间:2017-06-28 19:27:19

标签: .net asp.net-mvc asp.net-web-api viewmodel dto

注意:我的问题是在.NET / C#项目中使用DTO,ViewModel。

我知道DTO,ViewModel,Models。他们有特定的目的。我们使用DTO传输数据,使用ViewModel向最终用户显示数据。但我很困惑要将它们全部用在一起。我做了很多谷歌搜索,但没有找到一个完整的教程如何一起使用它们。

我不确定它们是否可以一起使用,或者它们必须用于特定目的,例如常规MVC,我们可以使用ViewModel,而对于WebAPI,我们将使用DTO。

任何人都可以解释使用它们的方式,或者赞赏任何链接都将它们全部集中在一起使用。

3 个答案:

答案 0 :(得分:3)

  

我做了很多谷歌搜索,但没有找到完整的教程如何   一起使用它们。

View <----------- -> Controller <-----------> Service/Repository
        ViewModel                    DTO
            ^--------AutoMapper-------^     

ViewModel 主要用于将数据 从Controller传递到View

数据传输对象(DTO) 是一个松散的术语;您也可以将POCO实体称为DTO。它主要用于将数据 从服务/存储库层传递到控制器 ,反之亦然。

将数据从DTO传输到ViewModel需要做很多工作,因此我们通常会将DTO中的 AutoMapper 用于ViewModel,反之亦然。

你绝对可以为MVC和WebAPI共享ViewModel。

  

任何人都可以解释使用它们的方式或任何链接表示赞赏   它将两者的使用集中在一起。

在我的示例项目中,我有EmailTemplateModel (查看模型)EmailTemplate

EmailTemplate类用于将数据从EmailTemplateService传输到EmailTemplateController。然后我使用AutoMapper来映射对象。

答案 1 :(得分:1)

如果您编写简单的CRUD应用程序,那么最好将ORM(EF)和View的模型分开,因为在此之后您的ViewModel不依赖于实体模型,您可以轻松更改数据库表而无需担心表示模型。

如果您编写了大型企业应用程序,您拥有丰富的域模型,那么请查看CQRS模式。 (见Udi Dahan post

在此之后,如果您选择使用此体系结构模式,那么有一个模型用于View,另一个模型用于ORM。 (见Materialized View pattern

答案 2 :(得分:0)

在DTO中,我们无法定义属性,但是在视图模型中,我们定义属性的意思是gettersetter。如果我们将数据从控制器传递到视图,反之亦然,则使用视图模型。如果我们使用回购模式并将数据从服务传递到控制器,则使用DTO。