我理解我的DDD模型项目should be totally isolated并没有引用我的应用程序的任何其他层,并且我的WCF服务将包含具有WCF服务所需的所有特殊属性的真实模型对象的DTO版本。该服务还将引用该模型并知道如何translate between the DTO and "real" model objects。
我想知道的是,使用此服务的客户端应用程序是否应该使用DTO对象或真实模型对象与之通信?客户端应用程序是否应该负责将它从服务接收的DTO对象转换为模型版本,或者是应该构建到服务中的那些东西,以便客户端不直接处理DTO对象?
我正在考虑创建一个包装器类,它包装一个服务实例并公开相同的功能,但是作为模型对象而不是DTO版本。好主意?不好主意?
答案 0 :(得分:3)
以下文章应回答您的问题
请勿忘记查看有关数据传输对象的Microsoft's和Martin Fowler's说明
此外。在客户端谨慎,dto更改不应导致相当大的编码
答案 1 :(得分:2)
WCF不理解'真正的模型类'它只能理解DTO。客户端代码必须以某种方式理解这些DTO(或序列化的有效负载)。所以你的问题是你是否可以使用来自客户端和服务器的相同域模型类。
我正在考虑创建一个包装器类,它包装一个服务实例并公开相同的功能,但是作为模型对象而不是DTO版本。好主意?不好主意?
这取决于您正在构建的应用程序类型以及您拥有的部署限制。
直接从客户端和服务器引用域对象意味着您必须同时升级它们。例如,如果您的“用户”实体具有“名称”属性,并且您决定将其拆分为“第一个”和“最后一个”,则需要同时更新客户端,服务器和数据存储。这只是一个简单的例子,模型行为的变化可能更成问题。如果您准备好在发生变化时重新部署整个堆栈,那么您的方法似乎没问题。在这种情况下,您甚至可以尝试避免使用“包装器”并尝试将此代码作为备用存储库实现。换句话说,您可以尝试使用两个存储库实现:一个用于客户端,一个用于服务。客户端存储库实现将使用WCF服务作为底层数据存储。服务使用的存储库实现将使用实际的数据存储。
另一方面,将客户端与服务器上的更改隔离开来可能是个好主意。在这种情况下,您的主域模型仅由服务引用,并作为客户端特定的DTO公开给客户端。这样,您可以自由地发展您的域模型和服务代码,而不会影响客户端。客户端可能有自己的模型类版本,如果你愿意,它将根据从服务器收到的DTO进行填充。