Arquitectura en ASP .NET MVC – Dudas y reflexiones

Estoy en un proyecto .NET que está siendo toda una experiencia personal profesional. Me estoy enfrentando a muchos retos y problemas y uno de los primeros y que no ha terminado es la definición de la Arquitectura.

Voy a poner varios conceptos sobre la mesa:

  • Suelo tener muchas dudas y cambios de opinión sobre organización y estructura de las aplicaciones.
  • Me gusta ver evolucionar la aplicación y dilatar cuestiones no claras hasta que se hagan claras
  • No considero que la arquitectura ha de ser constante.
  • No me incomoda estar muy seguro de una decisión en un momento dado y cambiar porque las condiciones del programa lo requieran.

Por todo ello, y para poder adaptarme al cambio de forma constante, me gusta mucho la separación por capas y el uso intensivo de patrones, ello me dota de la flexibilidad y control que necesito, independientemente de los cambios.

En concreto en .NET tengo actualmente tres proyectos independientes: Web, Dominio y Tests. Ya estoy atisbando que seguramente necesite refactorizar Dominio y dividirlo en Datos y Dominio, pero por ahora la capa es demasiado delgada.

En cada uno de estos proyectos llevo a cabo la parte de interacción (Web),  la lógica de negocio y EntityFramework (Dominio) y los Test que me van soportando el código. La separación en proyectos me da las siguientes ventajas:

  1. Las dependencias son explícitas. El dominio no depende de nadie y los otros dos dependen del dominio.
  2. Puedo trabajar en uno de los proyectos sin tener que recompilar toda la solución.
  3. El dominio lo puedo conectar con otros proyectos o software de terceros usando la DLL.

En la parte de Web, aplico el patrón MVC (es muy muy sencillo con toda la operativa que ya tiene .NET)  y por ahora es suficiente para la mayoría de la operativa. También tengo un directorio denominado Infraestructuras que engloba a aquellas funciones transversales que se aplican a todos lo elementos del proyecto (son los filters de .NET en concreto autorización y autentificación)

En la parte de Dominio tengo separadas las entidades de negocio de las entidades de EF. Lo hago así por dos motivos principales:

  1. Poder establecer otros mecanismos de acceso a datos que no sean a través de EF.
  2. Si tengo que actualizar las entidades de EF desde la BD por el motivo que sea no quiero que tenga repercusiones en el resto del proyecto.

La entidades de negocio se comunican con la BD a través del patrón Repositorio que hace uso de los objetos generador por EF. Para mapear los objetos EF en objetos de la lógica de negocio uso Automapper que he de reconocer que es sencillo y eficiente, me encanta que se puedan mapear colecciones y también objetos Linq (IQueryable).

Actualmente no uso contenedores de DI, pero porque estoy mirando las diferencias entre Unity y Ninject, pero tengo las clases desacopladas con interfaces y un constructor de dependencias, no será difícil introducir los contenedores de DI.

Los objetos de negocio, son versiones reducidas de los de la BD pero eso es bueno, porque reduce complejidad y permite crecer con cabeza (muchos de los campos de la BD tiene dudosa utilidad o están obsoletos).

En la parte de los test tengo los test unitarios y pruebas preliminares con SpecFlow, todavía no tengo integrado Selenium, pero me parece que voy a tener que añadirlo para poder cubrir todo con test. Los test están siendo un problema nada más empezar, porque no todo el equipo los entiende y no los respeta. De todas maneras esto es un cambio de mentalidad y ahora mismo yo me encargo de intentar cubrir todo el código con test unitarios, yo uso TDD y eso cubre muy bien el código de forma natural, pero hacer test al final y con código de dudosa calidad se hace complicado y tedioso y reconozco que a veces es un trabajo que no me agrada.

En otro post me gustaría hablar de infraestructura, porque estoy usando TFS + GIT con builds continuos y es algo muy potente y  sencillo, incluso aunque utilices librerías de terceros. También me gustaría hacer otro post sobre autentificación y autorización porque está suponiendo un quebradero de cabeza para la aplicación.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s