【发布时间】:2013-03-12 17:33:06
【问题描述】:
我正在构建 WCF 服务。
数据协定对象将与业务对象完全相同。
我应该在我的 WCF 服务中创建数据协定还是引用我的 BO 层并在我的 WCF 操作中使用这些业务对象?
【问题讨论】:
标签: wcf datacontract business-logic-layer
我正在构建 WCF 服务。
数据协定对象将与业务对象完全相同。
我应该在我的 WCF 服务中创建数据协定还是引用我的 BO 层并在我的 WCF 操作中使用这些业务对象?
【问题讨论】:
标签: wcf datacontract business-logic-layer
我会将它们分成不同的项目:
在服务中引用业务模型和数据合同。然后使用AutoMapper 将模型类映射到契约类,反之亦然。然后,您可以在不破坏 WCF 客户端的情况下更改模型,因为它们依赖于合同。
【讨论】:
如果您的业务对象可以被序列化,而不会将序列化的问题与业务逻辑混淆,那么我会说去吧。
不过,更好的选择是将您的业务逻辑层置于服务层之后,并从您的视图可以绑定到的服务中公开简单的 DTO。
我用 WCF RIA Services 写了一篇关于这种方法的文章,它可以很好地转换为标准 WCF Web 服务
【讨论】:
我认为在 @valpolushkin 的同一行,虽然我直到现在还没有使用过 AutoMapper。
请参阅我在 WCF Message & Data Contract, DTO, domain model, and shared assemblies 中的回答,了解使用业务实体作为数据合同可能导致重大更改的示例。
我认为,将 Business Objects 用作 DataContracts 是一种非常糟糕的做法。服务需要是自治的。该服务可能由拥有/尚未获得 Lax 版本控制的客户端使用。
很容易错误地认为添加新成员不会破坏现有客户。如果您不确定所有客户端都可以处理松散的版本控制,建议使用严格的版本控制指南并将数据合约视为不可变的。
另外,请参考MSDN - Service Layer Guidelines
设计在业务实体和数据合同之间转换的转换对象。
【讨论】: