Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 理解为什么我们使用数据传输对象来代替数据库实体进行数据契约_Asp.net Mvc_Wcf_Entity Framework_Decoupling - Fatal编程技术网

Asp.net mvc 理解为什么我们使用数据传输对象来代替数据库实体进行数据契约

Asp.net mvc 理解为什么我们使用数据传输对象来代替数据库实体进行数据契约,asp.net-mvc,wcf,entity-framework,decoupling,Asp.net Mvc,Wcf,Entity Framework,Decoupling,在使用web服务的客户机正在查找当前与数据库实体一一匹配的数据的情况下(即GetAccount、GetTransactions);我们仍然希望使用数据传输对象(dto)将两者解耦,以允许数据库实体在需要时进行更改,而不会使更改波及整个系统?如果是这样,从消费的角度来看,我们不希望客户机的模型直接基于数据传输对象。我们希望将从web服务返回的任何内容转换为本地模型,原因与我们最初使用DTO的原因相同?我有这个权利吗?DTO与要传输的数据的形状相匹配。如果它与底层数据模型匹配,那么就这样吧,但这是由

在使用web服务的客户机正在查找当前与数据库实体一一匹配的数据的情况下(即GetAccount、GetTransactions);我们仍然希望使用数据传输对象(dto)将两者解耦,以允许数据库实体在需要时进行更改,而不会使更改波及整个系统?如果是这样,从消费的角度来看,我们不希望客户机的模型直接基于数据传输对象。我们希望将从web服务返回的任何内容转换为本地模型,原因与我们最初使用DTO的原因相同?我有这个权利吗?

DTO与要传输的数据的形状相匹配。如果它与底层数据模型匹配,那么就这样吧,但这是由。您可能会在某个时候更改底层数据模型的形状,但DTO不会更改

此外,DTO是web服务传递给客户机的内容。如果您在服务器上定义了数据模型,那么您不希望分布式客户机必须了解该数据模型


最后,您的实体类可能包含额外的逻辑,而DTO只不过是公开数据的属性而已。

您的应用程序可以有许多概念层。数据层、业务层、服务层、表示层等等。每个都有一个特定的输入和输出功能。目标是如何设计一个松散耦合的系统(也就是说,事物之间并不严重依赖,因此任何更改都是孤立的,影响最小)。您希望最大限度地提高可维护性,提高重用性,并最大限度地提高速度。诀窍是降低复杂性,但建立一些基本的分离,允许您在需要时轻松地推进设计。记住雅格尼!你不会需要它的!人们倾向于为他们永远不会遇到的问题寻找和设计最复杂的体系结构!我多次听到“我们有一个单独的数据层,以便将来可以交换数据库”……但我从未见过这种情况发生!一个简单的存储库模式可以工作

如前一张海报所示,数据库(物理模型中)中的数据要转换为概念模型,以便进入应用程序。然后,任何客户机都将使用您的概念模型。我会在应用程序代码从数据层从数据库检索数据时或之后立即执行此操作。这确保了对数据库所做的任何更改都与应用程序的其余部分隔离开来。因此,您不必因为更改了数据库字段的名称而开始更改用户界面。您只需更新数据层

如果您选择实体框架作为数据访问策略,它将为您将数据库映射到概念模型。如果要将其他数据对象从一种类型转换为另一种类型,请查看AutoMapper等技术。您可以将实体框架POCO映射到服务契约(XSD)。从客户机的角度来看,“您可以”编写一个调用web服务的客户机代理,将返回的服务契约映射到一个良好的共享概念对象模型

保持简单。将重复使用和简单性作为您选择的核心。如果您开始在客户端对象中看到数据库列名,那么您需要开始考虑在解决方案的早期阶段加入一些抽象,以使您的应用程序免受更改。

是的,请参阅示例。