Arquitectura de bajo acoplamiento

Pensar una arquitectura de bajo acoplamiento
Para esto podemos dividir la aplicación en varios componentes, hacer referencia a los contratos (interfaces) y no a las implementaciones y asignarle sólo una responsabilidad a cada componente. Esto nos permitirá cambiar la implementación de dicho componente sin afectar los otros.

Por ejemplo DAOs tiene la responsabilidad del acceso a datos, no representa las entidades del dominio (que es responsabilidad de BEs), no tiene lógica de negocio (que es responsabilidad de Models), sólo se encarga de la persistencia de nuestro dominio (BEs). Quienes usan los DAOs, en realidad hacen referencia al contrato de DAOs, no a su implementación.

Arquitectura de nuestro ejemplo
Nuestro ejemplo se divide en tres grupos: Testing, Core e Implementations.
Grupo Testing:
Aquí están los test de nuestra aplicación, podríamos decir que estos tests son los que definen qué hace la aplicación en un modo verificable. Sólo podemos asegurar que funcione correctamente aquella característica que tenga su correspondiente test.
Los tests se dividen en tests unitarios (como Models.Testing) y tests de comportamiento o integración (como Integration.Testing).

Grupo Core:
- BEs: son las entidades que representan nuestro dominio.
- DTOs: son objetos serializables para la transferencia de información entre capas (físicas).
- DAOs: es el contrato que debe cumplir cualquier implementación de acceso a datos.
- Mappers: es el contrato que debe cumplir un conversor de BE a DTO y de DTO a BE.
- Models: es el contrato que debe cumplir cualquier implementación de lógica de negocios.
- Services: es el contrato que debe cumplir cualquier implementación de servicios de nuestra aplicación.

Como podemos ver, en el core de nuestra aplicación tenemos las definiciones de los componentes y no la lógica de los mismos (implementaciones). Aquí definimos los límites entre las piezas de nuestra aplicación y no cómo se va a resolver cada problemática en particular. Ésto nos permitirá cambiar las implementaciones cuando encontremos mejores alternativas.

Grupo Implementations:
Aquí encontramos las implementaciones de cada contrato, al momento de redactar este articulo hay una de cada uno. La implementación de Mappers está dividido en dos proyectos, uno implementa la transformación de DTO a BE (Mappers.AutoMapper) y otra de BE a DTO (Mappers.Reload).

Como podemos ver en el diagrama, las implementaciones sólo conocen los contratos de los otros componentes, esto es lo que nos va a garantizar que hay un bajo acoplamiento.

5 comentarios:

  1. Nelo!!! Lo que comentás en este código,a que versión del Repo corresponde? ¿La r13, del Viernes? ¿La r14 del Domingo? (Asumiendo que la nota es del Sábado, debería ser la 13)

    Gracias!!!!

    ResponderBorrar
  2. Si, aunque en este caso es algo que va a aplicar a todas las revisiones.

    ResponderBorrar
  3. Como estas nelo, he llego a tu blog justo a tiempo y por el grupo de nhibernate, que chevere, mi duda es la siguiente, la arquitectura que propones es DDD, si no lo es porque no optar por esta ?

    gracias !!!

    ResponderBorrar
  4. Hay algunas cosas de DDD en cuanto a la organización de la lógica de negocio que no termina de cerrar en mi cabeza. Pero tampoco soy un experto en el tema, voy a interiorizarme mas. Si te referís a la convención de nombres, podría ser. Quizás el mayor tema lo tengo en que llamo Services a la capa pública de la aplicación (por relación a web services o wcf services) y Models a la lógica de negocio, la cual está separada de las Entities por mas trivial que sea. Igual lo voy a pensar. Gracias!

    ResponderBorrar
  5. Gracias por la respuesta, seguire tu blog para ir aprendiendo, justo por el tema de arquitectura empece por leer DDD (todavia no termino), la que tu que tu propones Testing, Core e Implementation, algo similar he visto en otros proyectos que me he descargado del web, puedes hablar un poco mas sobre esta, o poner links para ahondar en el tema

    gracias nuevamente amigo

    salu2

    ResponderBorrar