Nuestra compañía está comenzando una iniciativa SOA bastante grande. Estamos haciendo muchas cosas bien: hay buena comunicación; dinero para herramientas cuando sea apropiado; y hemos aportado una buena experiencia para ayudarnos con la transición.
Estamos tratando de desarrollar estándares que podamos seguir como grupo, y uno de los estándares propuestos me está molestando bastante:
Hemos estandarizado el patrón donde cada operación toma un objeto de solicitud y devuelve un objeto de respuesta.
Me doy cuenta de que este es un enfoque más o menos estándar para mucha gente, pero me pregunto por qué debería molestarme. (No soy tan bueno con la sabiduría recibida, necesito algunos por qué).
La mayoría de los servicios que proporcionaré son simples recuperaciones de metadatos organizacionales. Por ejemplo, encuentre la política de seguridad para un usuario en particular. Esto necesita una identificación de usuario y nada más. El estándar me dice que debería envolver esta solicitud en un objeto y envolver la política devuelta en un objeto de respuesta.
Mi inquietud se amplifica con una mirada al WSDL que se genera a partir de nuestros contratos. WCF genera mensajes de solicitud y respuesta automáticamente y ajusta incluso el objeto de solicitud / respuesta.
Entiendo completamente que si está haciendo una solicitud compleja, entonces un objeto de entrada complejo está garantizado. Eso es lo que haría incluso si los servicios no estuvieran involucrados.
Mi pregunta es por qué debería ajustar automáticamente las solicitudes y respuestas cuando:
- Hace que los servicios simples sean menos expresivos
- Lo harías de todos modos para un servicio complejo
- WCF crea un mensaje de solicitud / respuesta de todos modos
He encontrado los siguientes argumentos a favor de este enfoque:
Admite el control de versiones al permitir que parámetros opcionales se deslicen en el objeto de solicitud.
En el pasado, hice una buena cantidad de COM, y consideraría que esto es casi un antipatrón para el control de versiones. Para algunas cosas, supongo que ayudaría, pero espero que donde ayude, de todos modos ya tenga un objeto de parámetro.
Permite aislar datos y comportamientos comunes a una clase base
Este tiene algo de peso conmigo.
Aleja a las personas de un comportamiento de estilo RPC hacia un comportamiento de mensajería
Leí esto en el sitio de Microsoft y lo escuché de nuestro gurú, pero todavía no tengo una idea clara de lo que significan o por qué es valioso. ¿Es que las interfaces de aspecto natural hacen que las personas tiendan a olvidar que están llamando a un servicio remoto?
Estoy buscando refactorizar las firmas de quizás 300 métodos, por lo que esta es una cantidad no trivial de dolor. Soy un gran fanático de la coherencia en las implementaciones, así que estoy dispuesto a asumir el dolor, solo ayudará a saber que al final todo valdrá la pena.
Las notas de Martin Fowler sobre el objeto de transferencia de datos son apropiadas aquí, creo.
Lo mismo podría aplicarse a las solicitudes. En cuanto a RPC, y por qué es malo:
Creo que es cierto, pero no es la razón principal. Otra razón para evitar RPC es que puede fomentar clientes y servicios estrechamente vinculados.
fuente