SOA中补偿缺乏继承的模式

时间:2012-02-28 07:29:15

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

我发现基类的继承和概念是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中的Expando对象

3 个答案:

答案 0 :(得分:4)

  

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

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

  

但SOA并不鼓励这样做。

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

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

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

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

继承只是意味着对象之间的关系难以建模和/或随时间变化。基本上这意味着使用POCO模型对象。

如果您想为您添加业务逻辑,请使用mixins来模仿继承。