我看到很多与映射相关的问题DTOs https://en.wikipedia.org/wiki/Data_transfer_object到域对象,但我觉得他们没有回答我的问题。我以前使用过很多方法并有自己的意见,但我正在寻找更具体的方法。
情况:
我们有很多领域对象。我们使用 CSLA 模型,因此我们的域对象可能非常复杂,并且它们包含自己的数据访问。您不想通过网络传递这些内容。我们将编写一些新服务,这些服务将以多种格式(.Net、JSON 等)返回数据。出于这个(以及其他原因),我们还创建了一个精益的数据传输对象来在网络上传递。
我的问题是:DTO和Domain对象应该如何连接?
我的第一反应是使用Fowler,DTO 模式型解决方案 http://martinfowler.com/eaaCatalog/dataTransferObject.html。我已经看过很多次这样的做法,我感觉很对。域对象不包含对 DTO 的引用。调用外部实体(“映射器”或“汇编器”)来从域对象创建 DTO。通常有一个ORM https://en.wikipedia.org/wiki/Object-relational_mapping在域对象方面。这样做的缺点是“映射器”对于任何实际情况都会变得极其复杂并且可能非常脆弱。
提出的另一个想法是域对象“包含”DTO,因为它只是一个精简的数据对象。域对象属性将在内部引用 DTO 属性,并且可以根据需要返回 DTO。我看不出这有什么问题,但感觉不对。我看过一些文章,人们使用NHibernate https://nhibernate.info/似乎使用了这种方法。
还有其他方法吗?上述方法之一值得使用吗?如果是或不是,为什么?
当您仅支持单个映射时,在域和 DTO 之间使用映射器的好处并不明显,但随着映射数量的增加,将该代码与域隔离有助于使域更简单、更精简。您不会因大量额外的权重而使您的域变得混乱。
就我个人而言,我尝试将映射保留在我的域实体之外,并将责任放在我所说的“管理器/服务层”中。这是位于应用程序和存储库之间的层,提供业务逻辑,例如工作流协调(如果您修改 A,您可能还必须修改 B,以便服务 A 可以与服务 B 一起使用)。
如果我有很多可能的结束格式,我可能会考虑创建一个可使用访问者模式的可插入格式化程序,例如转换我的实体,但我还没有发现需要任何如此复杂的东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)