【问题标题】:Patterns for Compensating Lack of Inheritance in SOA补偿 SOA 中缺乏继承的模式
【发布时间】:2012-03-17 16:38:04
【问题描述】:

我发现继承和基类的概念是 OOP 的强项。但这在 SOA 中是不鼓励的。那么,在 SOA 中克服这一限制的流行模式是什么?您能否提供解释(在 WCF 中进行代码演示)这些模式的教程?

注意:这不是关于 SOA 中可用模式的一般问题。但它更具体地针对上述问题。

注意:我将 WCF 用于 SOA。


阅读:

  1. “Do not use Abstract Base class in Design; but in Modeling/Analysis”

  2. How is an SOA architecture really supposed to be implemented?

  3. How to deal with Java Polymorphism in Service Oriented Architecture

  4. How to get up to speed on SOA?

  5. What is service-oriented architecture?

  6. Do DDD and SOA really play well together?

  7. SOA and WCF design questions: Is this an unusual system design?

  8. Designing WCF data contracts and operations

  9. C# 4.0 中的扩展对象

【问题讨论】:

  • 首先,继承虽然很有价值,但经常被过度使用。其次,WCF确实支持继承。您要解决的具体问题是什么?

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


【解决方案1】:

在 SOA 中不推荐继承的一个原因是您的代码是以模型为中心的。您有明确定义的进入和退出模型,并且您的代码应该在两者之间进行转换,并执行任何业务逻辑。

拥有继承只是意味着您的对象之间的关系很难建模和/或随着时间的推移而改变。基本上这意味着使用 POCO 模型对象。

如果您想为您的业务添加业务逻辑,您可以使用 mixins 来模拟继承。

【讨论】:

    【解决方案2】:

    我发现继承和基类的概念是 OOP 的强项。

    不要高估继承的力量 - 几乎所有 GoF 模式都是为了避免错误使用继承。

    但这在 SOA 中是不鼓励的。

    不,通常不鼓励这样做。为什么?因为在 SOA 中,您有一项服务提供一些操作。服务本身由服务描述(契约/接口)定义。如果是 SOAP 服务合同,则在 WSDL 中进行描述。如果您需要另一个服务提供相同的操作集但行为略有不同,您只需再次实现接口并将客户端定位到新服务(通过提供新的端点 URL)。因此,服务合同的继承“有效”,但与数据合同的工作方式不同。

    每个服务操作通常接受一些数据并返回一些数据。这些数据在服务描述中再次描述。在 SOAP 服务的情况下,数据被描述为 XSD。当您将数据从客户端发送到服务(或反向)时,数据必须被序列化,并且目标必须能够反序列化它们(除非您想直接使用 SOAP 信封,或者除非您想使用 xsd:any = untyped XML as pass数据)。如果你想在数据契约中使用继承,你必须以某种方式将派生契约的信息包含在服务描述中。只有在将此信息包含到服务描述中之后,您才能通知服务使用者有关继承数据协定的存在(他们需要此信息才能使用派生类型)。

    WCF 提供了处理继承数据协定的能力。您可以使用KnownTypeAttributeServiceKnownTypeAttribute 属性或DataContractResolver。您也可以查看great article 了解更多详情。

    如果是不可互操作且紧密耦合的系统(非 SOA),您还可以使用NetDataContractSerializer,它允许您不受任何限制地使用继承,因为每个序列化消息都包含反序列化所需的有关 CLR 类型的信息,并且具有服务的客户端应该共享数据合同程序集。

    【讨论】:

    • 您不需要 NetDataContractSerializer 在您的类层次结构中具有继承结构。 DataContractSerializer 工作得很好。
    【解决方案3】:

    无论您是否认为 SOA 是通过 SOAP、REST 或消息传递实现的,服务都是以文档为中心的。 Services are not object-oriented.

    虽然多态性在 OOD 中是一种强大的设计工具,但它不适用于 SOA,因为 SOA 建模不涉及类。

    【讨论】:

    • 谢谢。我在您的博客中读到“可以将 DTO 转换为正确封装的域对象的转换层”不是最好的主意。有哪些经过验证的替代方案?您能否提供一些优秀代码演示的链接(如果可能在 WCF 中)?
    猜你喜欢
    • 1970-01-01
    • 2017-06-04
    • 2011-09-16
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2011-05-04
    相关资源
    最近更新 更多