Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Oop DTO和域对象、WCF以及DB层交互_Oop_Architecture - Fatal编程技术网

Oop DTO和域对象、WCF以及DB层交互

Oop DTO和域对象、WCF以及DB层交互,oop,architecture,Oop,Architecture,我有asp.NETMVC2应用程序。我对创建DTO和域实体感到困惑 MVC控制器集成点: 1) 第三方WCF 2) 数据库层 WCF将返回特定公司的人员信息和公司的一些信息 我已经生成了WCF的代理,并在代理上编写了一个服务包装器。 服务包装器正在与WCF通信,并将结果映射到DTO clas ContactsDTO 服务层位于不同的项目中 以下是我的域类 Company Person DTO class //it contains class ContactsDTO { Person pers

我有asp.NETMVC2应用程序。我对创建DTO和域实体感到困惑

MVC控制器集成点: 1) 第三方WCF 2) 数据库层

WCF将返回特定公司的人员信息和公司的一些信息

我已经生成了WCF的代理,并在代理上编写了一个服务包装器。 服务包装器正在与WCF通信,并将结果映射到DTO clas ContactsDTO 服务层位于不同的项目中

以下是我的域类

Company
Person

DTO class
//it contains
class ContactsDTO
{
Person person, Company[] company
}
控制器操作使用companyID调用包装器并获取DTO类的对象。 并从dto更新公司信息。它在会话中更新公司信息,并将公司[]数组传递给其他一些操作

数据库交互:

现在,根据一些业务逻辑,我必须在数据库中插入个人id和公司id以及一些其他信息

为此,我创造了另一个

class DBDTO
{
Person person, Company[] company, OtherInfo otherInfo[]

}
这个DBDTO被准备好并传递给DB层(它使用LINQtoSQL)

问题

这就是写作的方式。DTO交互有什么改进吗?怎么回事 我可以做些改变来改进整体架构


将DB绑定对象转换为DTO(这需要时间)的另一种替代方法是使用POCO(普通的旧CLR对象),并将它们直接用作域模型、可存储在DB中的对象以及与控制器通信以进行可视化的对象。 这可以让您开始:

这种方法有几个优点

  • 您的POCO实体独立于底层DB实现
  • 您的POCO实体可以在不存在数据库的情况下进行单元测试
  • 您可以使用或轻松地将它们序列化为服务响应(如果您正在构建API)

我同意阿尔及达斯因责任不同而对车型进行区分

顺便说一下:MVC不是一个层概念。这是一个三重责任及其协作的概念。尽管它经常(mis)用于分层,但如果您仅使用“MVC”分离应用程序层,您将遇到SRP问题。如果每层都有MVC,那么就很好了


毕竟,如果它是一个小型应用程序,您可能永远不会达到架构出现问题的临界质量。

DTO,正如它在名称中所述,是数据传输对象。它应该只用于传输,不应该封装域对象,也不应该封装数据库对象。这就是说,您的DB层可能有一些特定的对象,例如DBObject,它们直接从DTO映射到DTO,而客户端的DTO直接从客户端对象映射到客户端对象,例如ClientEntity。有很多基础架构代码和映射,是的,但最终您将拥有干净、独立的客户端和DB层域对象代码。