【问题标题】:Passing Business Objects from a WCF Operation (service Layer to Data Layer)从 WCF 操作传递业务对象(服务层到数据层)
【发布时间】:2013-03-12 17:33:06
【问题描述】:

我正在构建 WCF 服务。

数据协定对象将与业务对象完全相同。

我应该在我的 WCF 服务中创建数据协定还是引用我的 BO 层并在我的 WCF 操作中使用这些业务对象?

【问题讨论】:

    标签: wcf datacontract business-logic-layer


    【解决方案1】:

    我会将它们分成不同的项目:

    • Foo.DataContracts
    • Foo.BusinessModels
    • Foo.Services

    在服务中引用业务模型和数据合同。然后使用AutoMapper 将模型类映射到契约类,反之亦然。然后,您可以在不破坏 WCF 客户端的情况下更改模型,因为它们依赖于合同。

    【讨论】:

    • 对不起,如果我没有给出完整的图片:我已经有一个现有的应用程序/解决方案:业务层(项目)、数据层(项目)和表示层(网站)。跨度>
    • 好的,为您的 WCF 创建另一个项目(服务)。然后,您可以为模型引用您的业务层项目。如果您不想为数据合同创建单独的项目,请将它们添加到新的 Services 项目中。映射模型合约。
    • 谢谢这样的回答我的问题这是剩下的疑问:为什么我必须定义数据合同?由于我在我的服务中引用了 BL,我不能直接使用那些(BO)对象吗? (因为它们将完全相同,甚至名称也是如此)。另外,我现在只是在谈论一些对象,所以我不想了解 AutoMapper。你能告诉我是否需要在我的 Services 项目中创建一个新的类文件并有一个方法来映射 Contracts BO 属性到属性吗?是吗?再次感谢
    • 可以,但是当您决定更改 BO 实施时会发生什么?您将对 WCF 进行重大更改,您的客户将无法使用它。数据合同的重点是避免这种情况。我知道你的对象现在是相同的,但你应该设计你的架构以长期工作。
    【解决方案2】:

    如果您的业务对象可以被序列化,而不会将序列化的问题与业务逻辑混淆,那么我会说去吧。

    不过,更好的选择是将您的业务逻辑层置于服务层之后,并从您的视图可以绑定到的服务中公开简单的 DTO。

    我用 WCF RIA Services 写了一篇关于这种方法的文章,它可以很好地转换为标准 WCF Web 服务

    【讨论】:

    • 谢谢,会看你的文章。将 BL “带入” SL 背后是什么意思——我假设你的意思是创建数据合同并将它们映射到 BO...?
    【解决方案3】:

    我认为在 @valpolushkin 的同一行,虽然我直到现在还没有使用过 AutoMapper。

    请参阅我在 WCF Message & Data Contract, DTO, domain model, and shared assemblies 中的回答,了解使用业务实体作为数据合同可能导致重大更改的示例。

    我认为,将 Business Objects 用作 DataContracts 是一种非常糟糕的做法。服务需要是自治的。该服务可能由拥有/尚未获得 Lax 版本控制的客户端使用。

    请参考Service Versioning。

    很容易错误地认为添加新成员不会破坏现有客户。如果您不确定所有客户端都可以处理松散的版本控制,建议使用严格的版本控制指南并将数据合约视为不可变的。

    另外,请参考MSDN - Service Layer Guidelines

    设计在业务实体和数据合同之间转换的转换对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2012-11-01
      • 2013-11-15
      • 2011-04-12
      • 1970-01-01
      相关资源
      最近更新 更多