将DataContract对象与my”分开是否是一种良好的做法;域名“;WCF服务中的对象?

将DataContract对象与my”分开是否是一种良好的做法;域名“;WCF服务中的对象?,wcf,domain-driven-design,datacontract,Wcf,Domain Driven Design,Datacontract,我目前是一个项目的一部分,在这个项目中,我们托管了一个WCF服务,供某些客户访问。WCF解决方案分为4个不同的C#项目: Host.csproj DataContracts.csproj Infrastructure.csproj Model.csproj 加入这个项目后,我立即想知道为什么有一个单独的项目用于“DataContract”对象,另一个用于“Model”对象。这两个项目基本上包含相同对象的副本。例如,在DataContract项目中,有一个具有4个属性的Customer对象,模型

我目前是一个项目的一部分,在这个项目中,我们托管了一个WCF服务,供某些客户访问。WCF解决方案分为4个不同的C#项目:

Host.csproj
DataContracts.csproj
Infrastructure.csproj
Model.csproj
加入这个项目后,我立即想知道为什么有一个单独的项目用于“DataContract”对象,另一个用于“Model”对象。这两个项目基本上包含相同对象的副本。例如,在DataContract项目中,有一个具有4个属性的Customer对象,模型项目也有一个具有相同4个属性的Customer对象。。。我注意到,在应用程序代码中使用了很多automapper(映射),将datacontact对象映射到模型对象,然后在流经典型的服务存储库模式时将模型对象重新映射回数据契约对象。在该服务中生成结果所需的映射数量已经变得非常烦人

在询问了一些队友为什么选择这条路线后,我被告知DataContract不应该包含域逻辑,它们严格地说是用于通过线路发送的对象(所有域逻辑都应该使用对象的模型版本来完成)

我觉得这种方法有点不必要。难道我们不能放弃datacontracts项目,将我们的模型对象用于服务端的域逻辑和datacontracts吗

有人启发我

难道我们不能放弃datacontracts项目,使用我们的 为服务端上的域逻辑和 数据合同

是的,从物理上讲,您可以从服务中公开域对象,这可能会为您节省一两个映射

然而,让我们想象一下,在未来,域模型会根据业务需求而变化

  • 现有的消费者对他们的合同很满意,不希望每次发布时都要更改,因此您只能进行一小部分可能的更改,或者您必须等到他们准备发布后才能进行更改

  • 有一天,另一个商业消费者会出现,他们希望利用您的域功能。但他们不希望与现有消费者签订相同的合同。你如何在不破坏现有消费者的情况下为他们提供他们想要的

  • 另一个开发团队希望在进程中使用您的域模型,因此您向它们发送一个程序集,但它们的部署服务器是.net 2.0,因此无法尝试加载System.Runtime.Serialization.dll

更一般地说,当您与外部从属关系紧密相连时,如何发展您的域功能

如果您认为这些情况都不适用于您,并且您的服务将永远是存储库中一些古老且不变的业务功能的简单外观,那么就去做吧

或者

你觉得恼人的映射是为了保护你免受不可避免的变化。作为一个服务的消费者,与该服务的发布时间表耦合是一场噩梦,这两方面都是如此。这些映射使您能够随心所欲地发展域的业务能力,而无需担心会破坏任何功能。要重命名字段吗?去做吧。厌倦了那个庞大的单一课程?将其重构为子类型。世界就是你的牡蛎

如果您担心效率或性能,那么进程内类型映射比进程外服务调用快几个数量级,几乎可以忽略不计

所以我要说的是你的同事给你的建议:

DataContract不应包含域逻辑,并且它们是 用于通过导线发送的对象

听起来很聪明。还有很多

如果您觉得映射很乏味,我以前就用过,这样可以省去很多麻烦