SOA中补偿缺乏inheritance的模式

我发现基类的inheritance和概念是OOP的最强点。 但是在SOA中并不鼓励这样做。 那么,在SOA中克服这种限制的流行模式是什么? 能否请您提供解释这些模式的教程(在WCF中使用代码演示)?

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

注意:我正在使用WCF进行SOA。


读:

  1. “不要在Design中使用Abstract Base类; 但在建模/分析中“

  2. 如何真正实现SOA架构?

  3. 如何在面向服务的体系结构中处理Java多态性

  4. 如何加快SOA的速度?

  5. 什么是面向服务的架构?

  6. DDD和SOA真的能很好地协同工作吗?

  7. SOA和WCF设计问题:这是一个不寻常的系统设计吗?

  8. 设计WCF数据合同和操作

  9. C#4.0中的Expando对象

无论您是否认为SOA是由SOAP,REST或消息传递实现的,服务都是以文档为中心的。 服务不是面向对象的 。

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

我发现基类的inheritance和概念是OOP的最强点。

不要过高估计inheritance的力量 – 几乎所有的GoF模式都是为了避免错误地使用inheritance。

但是在SOA中并不鼓励这样做。

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

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

WCF提供了处理inheritance数据协定的能力。 您可以使用KnownTypeAttributeServiceKnownTypeAttribute属性或DataContractResolver 。 您还可以查看这篇精彩的文章了解更多详情。

在不可互操作且紧密耦合的系统(非SOA)的情况下,您还可以使用NetDataContractSerializer ,它允许您使用inheritance而没有任何限制,因为每个序列化消息包含有关反序列化所需的CLR类型的信息,而具有服务的客户端应共享数据协定程序集。

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

拥有inheritance只意味着对象之间的关系很难建模和/或随时间变化。 基本上这意味着使用POCO模型对象。

如果你想为你添加业务逻辑,可以使用mixins来模仿inheritance。