典型情况。 我们在internally使用旧式XML Web服务在服务器场与多个分布式本地客户端之间进行通信。 没有第三方参与,只有我们自己和客户使用的应用程序。

我们目前正在考虑从XML WS转移到基于WCF/object-based模型,并且一直在尝试各种方法。 其中之一涉及直接通过线路传输域对象/聚合,可能会调用它们上的DataContract属性。

通过使用IExtensibleDataObjectDataContract使用的Order属性DataMembers ,我们应该能够应付简单的属性版本的问题(请记住,我们控制所有客户端,并且可以轻松地强制更新它们)。

我一直听说我们应该通过线路使用专用的,仅传输数据传输对象( DTOs )。

为什么? 还有理由这样做吗? 我们在服务器端和客户端使用相同的域模型,当然,只有在被认为是正确且“必要”时才预先填充集合等。 集合属性利用服务定位器原则和IoC来调用NHibernate-based “服务”直接获取数据(在服务器端),以及客户端上的WCF “服务”客户端与WCF服务器场进行通信。

那么 - 为什么我们需要使用DTOs

===============>>#1 票数:7

使用这两种方法(共享域对象和DTO)我会说共享域对象的大问题是当你不控制所有客户端时,但根据我过去的经验,我通常会使用DTO,除非它的开发速度是精华。

如果您有可能无法始终控制客户端,那么我肯定会推荐DTO,因为只要您与其他人的客户端应用程序共享您的域对象,您就会开始将您的内部内容绑定到其他人的开发周期。

我还发现DTO在版本化服务环境中工作时非常有用,这使我们能够从根本上改变应用程序的内部,但仍接受对旧版本服务接口的调用。

最后,如果您有许多客户端应用程序,那么使用DTO可能也是有益的,因为您可以通过易于版本化的服务进行保护。

===============>>#2 票数:6 已采纳

根据我的经验,DTO对以下方面最有用:

  1. 严格定义将通过线路发送的内容,并具有专门用于该定义的类型。
  2. 隔离应用程序的其余部分,客户端和服务器,以防将来的更改。
  3. 与非网络系统的互操作性。 DTO当然不是必需品,但它们使设计“安全”类型更容易。

在您的场景中,这些设计功能可能并不重要。 我已经将WCF与严格的DTO和共享域对象一起使用,并且在两种情况下它都运行良好。 我通过网络发送域对象时唯一注意到的是我倾向于发送更多数据(并以意想不到的方式)然后我需要。 这可能更多是由于我缺乏WCF经验而不是其他任何事情; 但是如果你选择走这条路,那你肯定应该警惕。

  ask by HenningK translate from so

未解决问题?本站智能推荐:

3回复

WCF消息和数据合同,DTO,域模型和共享程序集

我有一个调用我的WCF业务服务层的Web客户端,后者又调用外部WCF服务来获取实际数据。 最初,我认为我会使用DTO并在不同的层次中拥有单独的业务实体......但我发现提倡DTO的微不足道的例子很简单。 我看到太多的重复代码并没有多少好处。 考虑我的域名: 示例域我有一个UI屏
2回复

DDD服务和WCF服务之间有什么区别?

我有一个DDD类库。 在其中,我具有以下结构: 我最近在解决方案中添加了WCF项目。 该项目将向iPhone客户端公开JSON网络方法。 WCF方法不太复杂-GetCustomers / GetCustomerDetails / GetAlerts GetAlertDetails
1回复

将SOA / WCF与DDD一起使用时,方法重复是否不可避免?

有一个客户端服务应用程序,它使用WCF来构建面向服务的体系结构,并使用DDD来构建服务内部的域层。 在“域层”中,具有方法的域对象Customer : 更改电话和地址Customer.Relocate(Phone, Address) 将销售经理分配给客户Customer.
2回复

设计服务对象是特定的还是通用的方法?

方案:对WCF服务使用分层方法:商业服务将域/ DTO对象返回给客户端。 仍在开发中,因此我们可以打破合同。 人员对象具有名字和姓氏。 成员对象具有税号和出生日期。 这是因为在我们的域中,只有成员才能获得税号和出生日期。 使用此结构从服务取回数据时,很清楚哪些属性适用。 现在
1回复

WCF对象,多个IList实现和序列化错误

问题: WCF合同对象无法实现两种类型的列表(即:列表和列表)。 冗长的解释: 我正在现有的核心系统之上构建WCF服务,并且正在尝试找出实现某些业务对象的最佳方法。 核心系统利用所有业务对象的接口-例如,人员管理功能要求我传入一个实现IPerson的对象。 这里没有什么
2回复

域驱动设计中的WCF序列化和值对象模式

Eric Evans的Domain Driven Design一书描述了称为值对象的模式。 值对象的一个​​重要特征是它是不可变的。 作为一个例子,我有一个值对象“Clinic”,它必须有一个名字和一个id。 为了使它成为一个值对象,我没有在name和id上提供setter。 另外为
3回复

如何使用Webservices传递对象等复杂类型?

这可能听起来像一个简单的问题,但作为Webservies的新手,这是我第一次使用它,所以我怀疑。 问:如何使用Web服务传递对象或复杂类型? 我创建了一个简单的Web服务,并传递字符串和整数类型,但我不知道如何使用webservice传递对象,因此任何指导都将受到高度赞赏。 谢谢。
1回复

从PHP发送字节数组到WCF

我必须从我的PHP客户端向WCF主机发送一个字节数组(编码的照片)。 当我在PHP中对我的数组执行var_dump()时,我得到一个数组[2839],这是好的但是在服务器端调试时我看到接收到的数组只是字节[5] ...我知道如何修复它? 我用这样的代码 正如我之前在wcf主机上写
1回复

WCF集成任务,需要通过Soap服务传输大量数据

我必须设计一个集成解决方案,该解决方案可以传输大量数据并每天工作一次。 我们与之合作的公司X将调用服务,并将数据作为参数。 您对此解决方案有何建议? 例如,您认为我必须告诉X公司他们必须发送压缩(gzip?)数据吗? 还是我必须意识到这种使用情况: 您如何开发此类任务
1回复

使用HTTP上的自定义绑定在我的WCF服务上实现传输安全性

我是WCF安全新手。 我正在尝试在我的WCF服务上实现传输安全性。 我们在HTTP上使用custombinding。 有人可以建议我们怎么做? <customBinding> <binding name="CustomBinding"> <binaryMe