Patrones para compensar la falta de herencia en SOA

Encuentro Herencia y concepto de clase base como el punto más fuerte de OOP. Pero esto no se fomenta en SOA. Entonces, ¿cuáles son los patrones populares para superar esta limitación en SOA? ¿Podría proporcionar tutoriales que expliquen (con la demostración del código en WCF) estos patrones?

Nota: esta NO es una pregunta general sobre los patrones disponibles en SOA. Pero es más específico al problema mencionado anteriormente.

Nota: Estoy usando WCF para SOA.


Leyendo:

  1. “No use la clase Base abstracta en Diseño; pero en Modelado / Análisis ”

  2. ¿Cómo se supone que se debe implementar una architecture SOA?

  3. Cómo lidiar con el polymorphism de Java en la architecture orientada a servicios

  4. ¿Cómo ponerse al día con SOA?

  5. ¿Qué es la architecture orientada a servicios?

  6. ¿DDD y SOA realmente juegan bien juntos?

  7. Preguntas de diseño de SOA y WCF: ¿Es este un diseño de sistema inusual?

  8. Diseño de contratos y operaciones de datos WCF

  9. Expando objetos en C # 4.0

Independientemente de que piense o no en SOA según lo implementado por SOAP, REST o mensajería, los servicios están centrados en el documento. Los servicios no están orientados a objetos .

Si bien el polymorphism es una herramienta de diseño sólida en OOD, no es aplicable en SOA porque el modelado SOA no involucra clases.

Encuentro Herencia y concepto de clase base como el punto más fuerte de OOP.

No sobreestime el poder de la herencia: casi todos los patrones de GoF tratan de evitar el uso incorrecto de la herencia.

Pero esto no se fomenta en SOA.

No, generalmente no se fomenta. ¿Por qué? Porque en SOA tienes un servicio que brinda algunas operaciones. El servicio en sí está definido por la descripción del servicio (contrato / interfaz). En el caso de los servicios SOAP, el contrato se describe en WSDL. Si necesita tener otro servicio que proporcione el mismo conjunto de operaciones con un comportamiento ligeramente diferente, implementará la interfaz nuevamente y dirigirá al cliente a un nuevo servicio (proporcionando una nueva URL de punto final). Entonces, la herencia con el contrato de servicio “funciona” pero no funciona de la misma manera con los contratos de datos.

Cada operación de servicio generalmente acepta algunos datos y devuelve algunos datos. Estos datos se describen nuevamente en la descripción del servicio. En el caso de los servicios SOAP, los datos se describen como XSD. Cuando envía datos del cliente al servicio (o en dirección inversa) los datos deben ser serializados y el destino debe poder deserializarlos (a menos que desee trabajar con sobres SOAP directamente oa menos que desee usar xsd: any = XML sin tipo como pasado) datos). Si desea utilizar la herencia en el contrato de datos, de alguna manera debe incluir información sobre los contratos derivados en la descripción del servicio. Solo después de incluir esta información en la descripción del servicio puede informar a los consumidores del servicio sobre la existencia de contratos de datos heredados (necesitan esta información para trabajar con tipos derivados).

WCF ofrece la capacidad de trabajar con contratos de datos heredados. Puede utilizar los KnownTypeAttribute , ServiceKnownTypeAttribute o DataContractResolver . También puedes consultar este excelente artículo para más detalles.

En el caso de sistemas no interoperables y estrechamente acoplados (no SOA) también puede usar NetDataContractSerializer que le permite usar herencia sin limitaciones porque cada mensaje serializado contiene información sobre el tipo de CLR necesario para la deserialización y los clientes con servicio deben compartir conjuntos de contratos de datos.

Una razón por la cual no se recomienda la herencia en SOA es porque su código está centrado en el modelo. Tiene modelos de entrada y salida bien definidos, y su código debe traducir entre los dos, además de realizar cualquier lógica comercial.

Tener herencia simplemente significaría que las relaciones entre sus objetos son difíciles de modelar y / o cambiar con el tiempo. Básicamente esto significa usar objetos del modelo POCO.

Si desea agregar lógica de negocios a su uso, use mixins para imitar la herencia.