POCO =普通旧CLR(或更好:类)对象
DTO =数据传输对象
在这篇文章中有一点不同,但坦率地说,我读到的大多数博客都以DTO的定义方式描述了POCO:DTO是用于在应用程序层之间移动数据的简单数据容器.
POCO和DTO是一回事吗?
我正在尝试使用java将DO转换为DTO并在开始编写自己的工具之前寻找自动化工具.我只是想知道是否有相同的免费工具.
什么是数据传输对象?
在MVC中是模型类DTO,如果没有,有什么不同,我们是否需要两者?
architecture model-view-controller data-transfer data-transfer-objects dto
我目前正在为一个项目创建一个REST-API,并且正在阅读关于最佳实践的文章.许多人似乎反对DTO,只是暴露域模型,而其他人似乎认为DTO(或用户模型或任何你想称之为的)是不好的做法.就个人而言,我认为这篇文章很有意义.
但是,我也理解DTO的缺点,包括所有额外的映射代码,可能与其DTO对应物100%相同的域模型等等.
我们的API主要是为了让其他客户端可以使用数据而创建的,但是如果我们做得对,我们也希望尽可能将它用于我们自己的Web GUI.
问题是我们可能不希望将所有域数据公开给其他客户端用户.大部分数据只在我们自己的Web应用程序中才有意义.此外,我们可能不希望在所有方案中公开有关对象的所有数据,尤其是与其他对象的关系等.例如,如果我们公开特定对象的列表,我们不一定要暴露整个对象层次结构; 这样对象的孩子就不会暴露,但可以通过链接(hateoas)发现.
我该如何解决这个问题?我正在考虑在我们的域模型上使用Jackson mixins来控制在给定不同场景的情况下会暴露哪些数据.或者我们应该一直使用DTO - 即使考虑到它的缺点和争议?
我最近听到人们说数据传输对象(DTO)是一种反模式.
为什么?有哪些替代方案?
我正在使用NHibernate来保存我的域对象.为了简单起见,我将ASP.NET MVC项目用作表示层和服务层.
我想从我的控制器类返回XML中的域对象.在Stack Overflow上阅读了一些帖子后,我收集DTO是可行的方法.但是,我也遇到过有关ViewModel的帖子.
我的问题:数据传输对象和ViewModels是一样的吗?或者ViewModel是DTO的一种子模式?
我已经看到很多关于将DTO映射到Domain Objects的问题,但我觉得他们没有回答我的问题.我之前使用过很多方法并有自己的看法,但我正在寻找一些更具体的东西.
情况:
我们有很多域对象.我们使用CSLA模型,因此我们的域对象可能非常复杂,并且包含自己的数据访问.你不想在线上传递这些.我们将编写一些新服务,以多种格式(.Net,JSON等)返回数据.出于这个(以及其他原因),我们还创建了一个精简的数据传输对象,以便在线路上传递.
我的问题是如何连接DTO和Domain对象?
我的第一反应是使用Fowler,DTO模式类型的解决方案.我已经多次看过这件事了,对我来说感觉很对.域对象不包含对DTO的引用.调用外部实体("映射器"或"汇编器")以从域对象创建DTO.通常在域对象端有一个ORM.这样做的缺点是"映射器"在任何真实情况下都会变得非常复杂,并且可能非常脆弱.
提出的另一个想法是域对象"包含"DTO,因为它只是一个精益数据对象.域对象属性将在内部引用DTO属性,如果需要,可以返回DTO.我可以看到没有问题,但感觉不对.我看过一些使用NHibernate的人似乎使用这种方法的文章.
还有其他方法吗?以上是值得使用的方式之一吗?如果是,如果没有,为什么?
感谢您提前了解任何信息.
MVC模型对象,域对象和DTO之间有什么区别?
我的理解是:
MVC模型对象:
为相应视图显示的数据建模.它可能不直接映射到域对象,即可能包括来自一个或多个域对象的数据.
域对象:
用于对问题域中的现实世界对象进行建模的对象,如预留,客户,订单等.用于保存数据.
DTO(数据传输对象):
当层处于单独的进程中时,用于在层之间传输数据的对象,例如从DB到客户端应用程序.在获取与多个域对象相对应的数据时,允许跨线的单个事务而不是多个调用.DTO仅包含数据和访问器方法,并且不存在逻辑.该数据用于特定的DB事务,因此它可以或可以不直接映射到域对象,因为它可以包括来自一个或多个域对象的数据.
所以,问题:
以上理解是否正确?我错过了一些关键点吗?
是否有任何理由不使用Domain对象作为MVC模型,假设Model对象不需要额外的业务逻辑?
是否有任何理由不使用DTO作为MVC模型,假设Model对象不需要额外的业务逻辑?
我知道这可能是一个古老的问题,但更好的做法是什么?在应用程序的所有层中使用域模型对象,甚至在JSP上直接将值绑定到它们(我使用的是JSF).或者将域模型对象转换为DAO或服务层中的DTO,并将轻量级DTO发送到表示层.
我被告知使用DTO是没有意义的,因为对数据库的更改将导致所有DTO的更改,而在任何地方使用模型对象只需要更改受影响的模型对象.然而,DTO的易用性和轻量级特性似乎超过了这一点.
我应该注意我的应用程序使用Hibernate模型对象并使用自己的自定义创建的模型对象(意味着没有绑定到任何数据库会话,总是分离).以上任一方案对严格的模型对象模式更有利吗?对于像Lazy Initialization Exceptions这样的事情,使用Hibernate是一个巨大的PITA.
我正在编辑这个问题,希望能够进一步讨论(不确定我是否正确行事):
我对模型对象的问题在于它们根本不灵活.下面的评论说应该设计应用程序,以便可以在所有层中使用模型对象.为什么?如果用户想要一个荒谬的功能,我应该告诉他们,"好吧,这对模型对象不起作用"?
简单而简单,有时候模型对象不起作用.你可能有:
public class Teacher {
List<Student> students;
[tons of other Teacher-related fields]
}
public class Student {
double gpa;
[tons of other Student-related fields]
}
Run Code Online (Sandbox Code Playgroud)
但也许你不需要所有这些信息.您只需要教师的姓氏,他们今年教授的学生人数,以及所有学生的平均GPA.在那种情况下你会做什么?检索完整的教师信息和学生关系,然后您的代码计入学生列表,然后计算内部所有gpas的总平均值?这似乎比简单地使用'String lastName','int numStudents'和'double combinedGpa'创建DTO更加努力;
听起来好像我已经考虑到了这些,但我还没有在一个应用程序中工作,在这个应用程序中,模型对象可以在每个实例中完全使用.具有不同寻常的用户需求的常规实际应用程序不能以这种方式工作.