情况如下:我们有许多域对象。我们使用CSLA模型,因此我们的域对象可能非常复杂,并且它们包含自己的数据访问。您不希望在网络上传递这些对象。我们将编写一些新服务,将以多种格式(.Net、JSON等)返回数据。出于这个原因(和其他原因),我们还创建了一个精简的数据传输对象,在网络上传递。
我的问题是:DTO和域对象应该如何连接?
我的第一反应是使用Fowler,DTO模式类型解决方案。我看到过这样做很多次,感觉对我来说是正确的。域对象不包含对DTO的引用。调用外部实体(“映射器”或“组装器”)从域对象创建DTO。通常,在域对象侧有ORM。缺点是“映射器”在任何真实情况下都变得非常复杂,并且可能非常脆弱。
另一个提出的想法是将DTO“包含”在域对象中,因为它只是一个精简数据对象。域对象属性会内部引用DTO属性,并且如果需要,可以直接返回DTO。我认为这种方法没有问题,但感觉不对。我看过一些使用NHibernate的人似乎使用了这种方法。
还有其他方法吗?上述方法中的哪一个值得使用?如果是或者不是,为什么?