【问题标题】:Alternatives for Translation Layer in SOA: WCFSOA 中转换层的替代方案:WCF
【发布时间】:2012-03-17 20:40:40
【问题描述】:

服务不是面向对象的。假设我有一个基于 OOAD 的设计。我们可以使用 Translation Layer 将其转换为 DTO(没有任何行为)。但这会导致代码量的大幅增加。在 WCF 中(通过 C#)有哪些替代想法?

如果在 SOA 和 OOAD 之间进行这种转换是否是个好主意,请发表您的意见。当我们拥有 SOA 或使用此类映射技术时,我们是否应该完全避免 OOAD?

创建“特定于操作的 DTO”而不是创建“删除行为后直接从域中创建 DTO”是个好主意吗?是否有“特定于操作的 DTO 方法”的任何工具?

AutoMapper 是否产生“特定于操作的 DTO”或“来自没有行为的域的 DTO”?

注意:具体操作的DTO方法可以参考“Do not use Abstract Base class in Design; but in Modeling/Analysis”的答案

Service Layer Guidelines提取

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

参考文献

  1. How to restrict web service data contract properties based on user role
  2. SOA Question: Exposing Entities
  3. What is the best way of using DTOs in a SOA application?
  4. WCF Message & Data Contract, DTO, domain model, and shared assemblies

【问题讨论】:

  • 替代什么?您想在这里解决什么问题?
  • @Oded。 “翻译层”方法的替代方案

标签: .net wcf web-services c#-4.0 soa


【解决方案1】:

与软件开发(尤其是架构)中的其他所有事情一样,这些问题没有一个单一的正确答案。这取决于架构目标和约束。

WCF 与 DTO 一起使用。虽然可以下降到更原始的层并直接使用消息,但对于所有实际问题,DTO 是使用 WCF 的基本部分。由于在这种情况下 WCF 似乎是架构约束之一,因此实际上没有避免 DTO 的实用方法。

那么问题就变成了:是否应该有映射层?

如果我们可以回答另一个问题:从什么映射?

如果您已经有一个现有系统,则需要在现有系统和 WCF 边界之间进行转换。在这种情况下,需要一个翻译层。

如果你正在构建一个全新的系统,也许不翻译会更容易。

【讨论】:

  • 谢谢。我根据您的上一条评论发布了一个问题 - “如果您正在构建一个全新的系统,也许不翻译会更容易。”。你能回答stackoverflow.com/questions/9498962/…吗?
  • @Lijo:我认为马克的意思是,如果您的系统的全部目的是通过 WCF 公开某些信息,您可以构建您的系统,以便您的数据层实体直接建模您期望的值往返于您的服务。如果您的系统有多种其他职责,您可能只想通过 WCF 服务公开一小部分数据。
【解决方案2】:

查看Automapper,我们将其用于同一任务。

【讨论】:

  • 谢谢。虽然它会自动执行这个过程,但它会为这个专门的任务 - 翻译提供代码。进行翻译或完全忘记 OOAD 是一种好习惯吗?
  • 就我个人而言,我喜欢“控制”翻译。我们在服务中公开的“实体”将通过自动映射器从服务使用的源数据类型(即其他实体)进行转换。它为我们提供了对输出转换的细粒度控制,同时保持编译时类型检查。
  • AutoMapper 是否产生“特定于操作的 DTO”或“来自没有行为的域的 DTO”?
  • AutoMapper 仅映射。它不会创建 DTO 类 - 你会。这意味着您可以决定 DTO 是包含原始实体中的所有字段、大部分字段还是仅包含部分字段。
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多