首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何建模和处理从复杂的领域模型中抽象出来的表示DTO?

如何建模和处理从复杂的领域模型中抽象出来的表示DTO?
EN

Stack Overflow用户
提问于 2010-04-11 20:36:05
回答 3查看 2.8K关注 0票数 9

嗨,我正在开发一个应用程序,需要使用Hibernate处理复杂的域模型。这个应用程序使用Spring MVC,并且在表示层中使用域对象非常混乱,所以我认为我应该使用往返于服务层的DTO,以便这些对象与我在视图中所需的内容相匹配。现在假设我有一个CarLease实体,它的属性不是简单的java原语,而是由Make、Model等其他实体组成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class CarLease {
        private Make make;
        Private Model model;
        .
        .
        .
    }

大多数属性都采用这种方式,并且可以使用jsp视图上的下拉选择来选择它们,每个属性都会向控制器回发一个ID。

现在考虑一些标准用例:创建、编辑、显示

您将如何对表示DTO建模,以用作表单支持对象以及表示层和服务层之间的通信?

您会为每个案例创建不同的DTO (创建、编辑、显示),您会为复杂属性创建DTO吗?如果是这样,您会在哪里将ID转换为entity?

您将如何以及在何处处理验证、DTO/域组装,您将从服务层方法中返回什么?(创建、编辑、获取)

正如您所看到的,现在我将受益于将我的视图从域对象(非常复杂,有许多我不需要的东西)中分离出来。但我很难找到任何现实世界的例子和最佳实践。我需要一些从上到下的架构指导,请记住,我将使用Spring MVC,以防在您的应用程序上发挥作用。

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-11 21:56:50

无论如何(我是在C# .net中开发的--但这些原则希望对您仍然有帮助),我定义了一组类型(DTO),用于在业务层和数据层之间交换数据;并且每个域对象/实体都有多个类型。这些类被定义为简单的类。

其中每一个都是考虑到特定的任务而构建的,例如:

  • I有一个轻量级的类型,用于填充列表视图(有很多“行”,但没有很多“列”)。我也有一个对应的集合类型,其中包含任意数量的属性。
  • 我有一个“大”的get副本,它通常包含有问题实体的所有属性-但只针对它的一个实例。根据实体的大小和复杂性以及使用情况,我可能会有多个这样的类型;还取决于您是要立即返回与实体的实例关联的所有数据,还是要在以后的请求中延迟加载一些数据。
  • I通常也有单独的实体“保存”(新建)和“更新”类型。

每种类型都被设计为只保存与给定任务相关的信息。例如,"big“将返回上次修改的日期,但我不希望在我的保存和更新类型中出现这种情况,因为我在数据访问层中填充了这些类型。

此外,对于我的应用程序,这些类型存在于一个公共程序集中-因此它们可以在任何层之间重用,而不仅仅是在业务层和数据层之间。

架构Fit

这种方法没有什么特别之处,它有自己的优点和缺点;这些优点和缺点到底是什么以及它们如何影响您将取决于很多东西-我猜您的里程会有所不同-但它肯定已经为我服务了很多年。

人们经常对“关注点分离”大惊小怪-这是一个非常明智的举动;这与DTO有关,因为它们是在层(和服务、组件等)之间交换的,所以在究竟应该在哪里划线时总是有一些模棱两可的地方。

我采用的方法是,如果一些信息适合在to层之间交换,那么它可能适合在任何数量的层之间交换-所以为什么不让所有人都可以访问它呢?如果您只是传递信息,它还可以省去重新转换信息的麻烦。

就复杂性而言,有两种方法来处理:

  1. 使用冗长的/人类可读的命名约定;类型让你知道事物是什么;不管有多少-这就是智能(& docs)的用途。越直观越好。
  2. KISS-尽可能保持简单;你必须在合理的重用和单一责任原则之间取得平衡。

是否要为主实体的复杂属性创建

我发现自己做DTO有以下两个原因之一:

我知道我需要公开(推送)一些数据,

  1. 的设计是显而易见的:它是由我想要的数据驱动的,目的是让消费者知道它想要的是什么,而DTO就是为了满足这些需求而设计的。

因为它们都是在一个公共的程序集中定义的,没有一个组件“拥有”它,这有助于迫使你从“域”的角度来思考,而不是从以组件为中心的角度来考虑;在某种程度上,这将影响DTO的设计(平衡重用与SRP)。

在这两种情况下,DTO可以是特定于特定需求的,也可以是通用的;例如,只有一个int和一个字符串的DTO并不少见,它是用来发送到dropdownlists的那种东西。

我发回的大多数DTO集合(从DAL到BL)都是特定于某个概念的,而不是通用的。我通过我提供的构造函数强制执行这些非常基本的规则:每个参数都是必需的。我不确定这是否回答了你的问题“你是如何管理组装和验证的”。

票数 3
EN

Stack Overflow用户

发布于 2010-04-11 22:20:10

服务层应该返回DTO而不是EJB对象的想法主要是在EJB3/JPA时代之前的想法。在CRUD过程中,您可以从使用模型对象(也称为实体)。

但是,在用于性能优化时,您可以从使用DTO中获益,例如,当模型对象太大时,或者当您使用某些智能连接聚合模型数据时。

因此,除非您是在SOA下进行工程设计,否则我不建议使用DTO进行CRUD操作。

票数 1
EN

Stack Overflow用户

发布于 2010-04-12 02:27:36

您是否考虑过命令查询职责分离(CQRS)原则?简而言之,它是一种架构原则,提倡使用单独的组件进行读取和修改操作。

修改是使用发送给域模型的命令完成的。您的NewCarLeaseDTO看起来像一个命令-- CreateNewCarLeaseCommand。它们包含特定操作所需的所有数据。

另一方面,读取(无论是列表vies还是详细vies)直接在底层数据存储(SQL数据库)上完成。这里有许多可能性,从使用相同的数据存储来支持读取和写入部分,到通过发布/订阅基础设施连接两个独立的数据存储。

当使用后一种(两个存储)方法来读取端时,许多(比如Udi Dahan)提倡使用所谓的持久化视图。这意味着将数据直接存储在视图可使用的表单中。转换(反规范化)是在模型更新后进行同步时完成的。

如果你想了解更多关于CQRS的知识,我推荐阅读Udi Dahan和Greg Young。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2618617

复制
相关文章
AngularJS 控制器
控制器是 JavaScript 对象,由标准的 JavaScript 对象的构造函数 创建。
陈不成i
2021/07/23
1.2K0
使用 RequireJS 加载 AngularJS
AngularJS 目前的版本没有遵循 Javascript 约定的 AMD 模块化规范, 因此使用 RequireJS 加载 AngularJS 时需要一些额外的配置。
beginor
2020/08/10
1.3K0
使用 RequireJS 加载 AngularJS
解决angularjs图片加载失败
angularjs图片加载失败,本文的angularjs图片加载失败中的angularjs指的是angular2、angular4。
全栈程序员站长
2022/09/02
1.5K0
angularJS学习之路(三)---控制器
控制器是 JavaScript 对象,由标准的 JavaScript 对象的构造函数 创建。
wust小吴
2019/07/08
6290
angularjs 控制器、作用域、广播详解
一、控制器 首先列出几种我们平常使用控制器时的几种误区: 我们知道angualrJs中一个控制器时可以对应不同的视图模板的,但这种实现方式存在的问题是: 如果视图1和视图2根本没有任何逻辑关系,这样“
柴小智
2018/04/10
1.9K0
angularjs 控制器、作用域、广播详解
[angularjs] angularjs系列笔记(四)控制器
所有的应用都有一个$rootScope,它可以作用在ng-app指令包含的所有的html元素中
唯一Chat
2019/09/10
4060
Angularjs动态加载ECharts(二)
今早操作的时候又有了问题,我需要做的是select下拉框选择时间,然后将对应时间的数据显示到ECharts上 如图所示
治电小白菜
2020/08/25
7380
Angularjs动态加载ECharts(二)
Angularjs动态加载ECharts(一)
今早发现,directive写的echarts组件,虽然能够获取到Controller中的数据,但是当我使用$http请求到的数据,想传到directive却总是获取不到,知道这是异步问题,图表加载后,数据才请求到,所以图表加载不了数据 解决方法 使用ng-if,判断,如果有数据才显示,完美解决 <realtem-data ng-if="data" id="temdata" legend="legend" item="item" data="data"></realtem-data> 其余代码 con
治电小白菜
2020/08/25
9460
Angularjs动态加载ECharts(一)
按需加载 AngularJS 的 Controller
AngularJS 通过路由支持多视图应用, 可以根据路由动态加载所需的视图, 在 AngularJS 的文档中有详细的介绍, 网上也有不少教程, 就不用介绍了!
beginor
2020/08/10
1.2K0
Spark UDF加载外部资源
由于Spark UDF的输入参数必须是数据列column,在UDF中进行如Redis查询、白/黑名单过滤前,需要加载外部资源(如配置参数、白名单)初始化它们的实例。若它们都能被序列化,从Driver端初始化+broadcast的方式可以完成构建。而Redis、字典树等存在不能序列化的对象,也就无法从Driver端发送到Excutor端。因此,整体的思路是:在Driver端初始化可以被序列化的资源,在Excutor端利用资源构建不可序列化对象,从而分布完成整个对象的构建。
mikeLiu
2020/08/28
5.4K0
as3加载外部资源
在as3的开发中,经常会加载外部共用资源,比如某一个公用的图片或者其它小特效。这时候为了避免重复请求,一般会将这些资源放在一个fla文件中,为每一个资源添加链接。这里以一张图片为例(flower.fla):
meteoric
2018/11/16
8770
AngularJS中的按需加载ocLazyLoad
初学者,有不足的地方希望各位指出 一、前言     ocLoayLoad是AngularJS的模块按需加载器。一般在小型项目里,首次加载页面就下载好所有的资源没有什么大问题。但是当我们的网站渐渐庞大起来,这样子的加载策略让网速初始化速度变得越来越慢,用户体验不好。二来,分模块加载易于团队协作,减低代码冲突。   二、按需加载的对象 各个Controller模块、Directive模块、Server模块、template模板,其实这些都是一些 .js文件或者 .html文件 。     三 、按需加载的场
庞小明
2018/03/07
1.7K0
AngularJS系列(二)——作用域和控制器
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
逝兮诚
2019/10/30
4440
[CodeIgniter4]讲解-加载静态页
本教程旨在向您介绍CodeIgniter框架和MVC体系结构的基本原理。它将向您展示如何以逐步的方式构造基本的CodeIgniter应用程序。
landv
2020/03/04
3.6K0
AngularJS浅谈-博客
AngularJS是啥?(一脸懵逼) 简介: AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款
双愚
2018/05/28
2.4K0
网站404页面的设计
每一个网站都必须有404页面,404页面指的是显示网站错误链接的页面,可能是该访问的页面不存在,也可能是页面已经被删除。
岳泽以
2022/10/26
1.4K0
网站404页面的设计
Spark GenericUDF动态加载外部资源
文章1中提到的动态加载外部资源,其实需要重启Spark任务才会生效。受到文章2启动,可以在数据中加入常量列,表示外部资源的地址,并作为UDF的参数(UDF不能输入非数据列,因此用此方法迂回解决问题),再结合文章1的方法,实现同一UDF,动态加载不同资源。本文通过继承GenericUDF类,读取存放在Redis集群中的字符串,构建字典树,完成词包匹配,来说明这一工作。
mikeLiu
2020/09/01
2.7K0
AngularJS 应用
<html> 元素是 AngularJS 应用: ng-app="myNoteApp" 的容器:
陈不成i
2021/07/26
1.2K0
如何在 ASP.NET MVC 中集成 AngularJS(1)
介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术。例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务。另外,还有最新的数据库技术、最新的设计模式和技术。 当选择最新的软件技术时,有几个因素在起作用,其中包括如何将这些技术整合起来。过去两年中,我最喜欢的一项技术就是设计单页面应用(SPA)的 AngularJS。作为一个微软stack开发者,我也是使用 ASP.NET MVC 平台实现 MVC 设计模式和并进行研究的粉丝,包括它的捆绑和压缩功能
葡萄城控件
2018/01/10
7.6K0
如何在 ASP.NET MVC 中集成 AngularJS(1)
深入了解 AngularJS 路由的原理和使用技巧
在现代Web应用程序中,页面之间的导航是非常重要的。为了实现有效的导航和良好的用户体验,AngularJS 提供了一种强大的路由机制。通过使用 AngularJS 的路由功能,我们可以轻松地管理应用程序的不同视图,并根据URL的变化加载不同的组件。
网络技术联盟站
2023/07/04
2240

相似问题

使用angularjs在分隔页中加载外部库

12

AngularJS & Bootstrap模式加载模板外部控制器

11

在angularjs中重新加载外部控制器

11

AngularJS控制器工作,但不加载html页。

25

angularjs控制器模块参考加载空白页

11
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文