当前位置:  开发笔记 > 后端 > 正文

将DTO映射到域对象的最佳实践?

如何解决《将DTO映射到域对象的最佳实践?》经验,为你挑选了3个好方法。

我已经看到很多关于将DTO映射到Domain Objects的问题,但我觉得他们没有回答我的问题.我之前使用过很多方法并有自己的看法,但我正在寻找一些更具体的东西.

情况:

我们有很多域对象.我们使用CSLA模型,因此我们的域对象可能非常复杂,并且包含自己的数据访问.你不想在线上传递这些.我们将编写一些新服务,以多种格式(.Net,JSON等)返回数据.出于这个(以及其他原因),我们还创建了一个精简的数据传输对象,以便在线路上传递.

我的问题是如何连接DTO和Domain对象?

我的第一反应是使用Fowler,DTO模式类型的解决方案.我已经多次看过这件事了,对我来说感觉很对.域对象不包含对DTO的引用.调用外部实体("映射器"或"汇编器")以从域对象创建DTO.通常在域对象端有一个ORM.这样做的缺点是"映射器"在任何真实情况下都会变得非常复杂,并且可能非常脆弱.

提出的另一个想法是域对象"包含"DTO,因为它只是一个精益数据对象.域对象属性将在内部引用DTO属性,如果需要,可以返回DTO.我可以看到没有问题,但感觉不对.我看过一些使用NHibernate的人似乎使用这种方法的文章.

还有其他方法吗?以上是值得使用的方式之一吗?如果是,如果没有,为什么?

感谢您提前了解任何信息.



1> JoshBerke..:

当您仅支持单个映射时,拥有位于域和DTO之间的映射器的好处并不明显,但随着映射数量的增加,将该代码与域隔离有助于使域更简单和更精简.你不会因为额外的重量而混乱你的域名.

就个人而言,我尝试将映射保留在我的域实体之外,并将责任放在我称之为"管理器/服务层"的内容中.这是位于应用程序和存储库之间的层,并提供业务逻辑,例如工作流协调(如果修改A,则可能还必须修改B,因此服务A将与服务B一起使用).

如果我有很多可能的结尾格式,我可能会考虑创建一个可以使用访问者模式的可插入格式化程序,例如转换我的实体,但我还没有找到任何这种复杂的需求.



2> Garry Shutle..:

您可以使用自动化程序,例如Jimmy Bogard编写的自动程序,它在对象之间没有连接,并依赖于遵循的命名约定.


Automapper可能会导致意外暴露的属性 - >安全漏洞.最好明确说明应该作为DTO公开什么.
@deamon:有效的关注,但是由于人为疏忽而导致的错误(以及潜在的安全漏洞)也可以创建,编写所有粘性映射代码.我将走自动化之路并使用内置的自定义映射功能处理5%.

3> SturmUndDran..:

我们使用T4模板来创建映射类.

Pro - 在编译时可用的人类可读代码,比运行时映射器更快.100%控制代码(可以使用部分方法/模板模式在ad-hoc基础上扩展功能)

Con's - 排除某些属性,域对象集合等,学习T4语法.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有