Relaciones entre capas con VSTS 2010 y servicios WCF

Bueno, leyendo los posts de Bruno acerca de los diagramas de análisis de capas con VSTS 2010, y con mi solución de pruebas de las opciones de análisis de interacción entre capas, he descubierto un pequeño ¿bug?.

Y es que, una situación muy común en las aplicaciones n-capas, es, que la capa de usuario, como la capa WPF del ejemplo de Bruno, no llama directamente a la capa de negocio, si no a un servicio (en mi caso WCF).

En el ejempli del análisis de interacción de capas, llamábamos a un servicio WCF, que estaba dentro de la propia solución, en un proyecto de tipo web, pero siendo un servicio WCF, que es fácilmente descubierto, automáticamente a la hora de agregar la referencia al servicio.

Pues bien, si creamos un nuevo diagrama de capas (layer diagram), siguiendo las instrucciones del post de Bruno, agregamos todas nuestras capas y las relacionamos con los proyectos (incluyendo el servicio), y le damos a la opción Generate dependencies, oh, sorpresa, la dependencia de la capa de usuario con el servicio WCF no la muestra.

Habrá que investigar si es un bug o es “by design”, para mi es un bug, ya que es una dependencia más, ¿a vosotros que os parece?.

9 comentarios en “Relaciones entre capas con VSTS 2010 y servicios WCF”

  1. Pues si, no tiene mucho sentido que llame directamente al servicio, obligatoriamente se ha de llamar a la capa de negocios. Si no, la arquitectura n-capas deja de tener sentido si la capa de negocios tiene que realizar una consulta de datos sin recurrir a los servicios, esta creando dependencia sobre los servicios.

    Saludos.

  2. Hola Juan, creo que me he perdido algo de tu comentario …

    Hmmm, estoy hablando de aplicaciones distribuidas, en las que la capa de presentación no tiene acceso directo a la capa de negocio excepto a través de servicios, que están en otra maquina que si que tiene acceso a la base de datos etc.

    En las arquitecturas n-capas, en aplicaciones distribuidas, la capa de servicios, lo más habitual, es colocarla entre la capa de negocio y la capa de presentación.

  3. Si haces eso, creas dependencia de los servicios impidiendo que la capa de negocios pueda realizar llamadas a la capa de datos por la necesidad de los servicios, para mi, lo mas lógico seria que la capa de negocios llamase a los servicios si asi se requiere, de esta forma la capa de negocios puede en un momento determinado realizar llamadas directas a la capa de acceso a datos que no tiene porque estar ubicada en un servicio. Es decir que pienso que siempre la capa de presentación deberia de llamar a la capa ge negocios y esta en función de los interfaces realizar llamadas a los web services o a cualquier otra capa necesaria, aunque quizas sea yo el que me estoy perdiendo algo…

    Saludos.

  4. Aunque esta capa que yo llamo de negocios no es tal y como piensas, se trataria de una capa intermedia, que tan solo cumple las funciones de pasarela, es decir realiza las llamadas, en este caso realizaria las llamadas al web service, que tiene alojada la capa de negocios y las llamadas a los datos. De esta forma esta capa te crea independencia para que puedas llamar a logica de negocio alojada en una capa intermedia, sin necesidad de los web services.

  5. Hola de nuevo Juan, no entiendo muy bien esto que dices:

    «Si haces eso, creas dependencia de los servicios impidiendo que la capa de negocios pueda realizar llamadas a la capa de datos

    por la necesidad de los servicios,»

    La capa de negocios, según lo que yo tengo puesto, no necesita de la capa de servicios, la capa de negocios llama directamente a

    la capa de datos, y no tienen ninguna dependencia, más allá de la de datos ¿?

    La única que necesita la capa de servicios, es la capa de presentación, y ojo, sólo en casos en los que la capa de UI está

    distribuida.

    Si la capa de UI distribuida (p.ej.:WPF), llama directamente a la capa de negocio, has de distribuir también la lógica de negocio,

    lo cual puede no ser un problema, pero hay veces que te interesa no distribuirla, por razones de seguridad, de mantenimiento, etc.

    Además, esta capa de servicios, es un simple wrapper de la llamada a la capa de negocio, es decir, no hace más que recibir la

    llamada de la capa de UI, y pasarla a la capa de negocio, que está en el mismo servidor que la capa de servicios.

    En el caso de que mañana, la capa de UI, cambie, por ejemplo, a un interfaz web, instalado en el mismo servidor que la capa de

    negocio, se podría llamar directamente a la capa de negocio, sin pasar por la de servicios, por lo que no se crea ninguna

    dependencia.

    Si por el contrario, tu capa de negocio llama siempre a la de datos a traves de servicios, ahí si que estás creando esa

    dependencia de los servicios, además, el caso más usual, es que capa de negocio, y capa de datos, aún siendo distintos

    ensamblados, están instalados en el mismo servidor, con lo que no hay necesidad alguna de servicios.

    Ya te digo que el objetivo de esta capa de servicios, entre UI distribuido y capa de negocio, es simplemente evitar distribuir con

    tu aplicación cliente, la lógica de negocio. Pero la lógica de negocio y la de datos, entre ellas, no habrían de necesitar

    servicios.

  6. No tiene sentido llamar desde la capa de presentación diractamente a la capa de negocio, excepto en el caso en que la capa de presentación sea ASP.NET (para aumentar el rendimiento al disminuir la latencia de llamada). Y solo en el caso en que por razones de seguridad no se exija tener el Tier ASP.NET separado y en diferente red que el servidor de componentes de negocio.
    Casi en el resto de casos, donde el cliente es remoto (WPF, Silverlight, OBA, Winforms), la capa de presentación debe acceder a las capas de negocio a través de una capa de Servicios cuya única funcion sería ‘publicar’ las capas de negocio.

    En cuanto al diagrama LAYERS de VSTS.2010, actualmente (la BETA1) solo muestra dependencias (invocaciones a métodos de objetos) que sean directas, es decir, directamente por el CLR, no detecta dependencias de llamadas a Servicios Web / WCF.

  7. Si, siento haberme explicado tan mal, segun dices «La única que necesita la capa de servicios, es la capa de presentación, y ojo, sólo en casos en los que la capa de UI está distribuida.», para evitar esta dependencia de la capa de prensentación con la de servicios (no logica de negocio ni datos), puedes incluir una capa intermedia que realize las llamadas a la capa de servicios, de esta forma si un dia quieres realizar llamadas utilizando otra tecnología el cambio sera mas sencillo, aunque como apuntas tampoco tendria mayor relevancia ya que funciona como un simple wrapper de la llamada a la capa de negocios.

    En resumen estoy completamente deacuerdo con lo que expones, tan solo trataba de decirte que si incluyes otra capa entre presentación y servicios, el cambio hacia otra tecnologia puede resultar mas facil, aunque la complejidad aumenta con cada capa que se añada, si bien utilizando generics e interfaces se podria minimizar.

    Saludos.

Responder a jirigoyen Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *