He recibido el visto bueno para comenzar a sentar las bases de una nueva arquitectura para nuestra base de códigos en mi empresa. El ímpetu para esta iniciativa es el hecho de que:¿Cómo separar capas en una arquitectura de capas estrictas y promover la modularidad sin causar redundancia innecesaria?
- Nuestra base de código tiene más de diez años y finalmente se rompe en las costuras cuando tratamos de escalar.
- Las "capas" superiores, si quieres llamarlas así, son un desastre de clásico ASP y .NET.
- Nuestra base de datos está llena de un montón de procesos almacenados impíos que contienen miles de líneas de lógica de negocio y validación.
- Los desarrolladores anteriores crearon soluciones "inteligentes" que son no extensibles, no reutilizables, y exhiben anti-patrones muy obvios; estos deben estar en desuso en poco tiempo.
he estado haciendo referencia a la MS Patterns and Practices Architecture Guide muy fuertemente, ya que trabajo hacia un diseño inicial, pero todavía tengo algunas preguntas pendientes antes de comprometerse a nada. Antes de entrar en las preguntas, esto es lo que tengo hasta ahora para la arquitectura:
(de alto nivel)
(capas de negocio y datos de profundidad)
Los diagramas muestran básicamente cómo pretendo dividir cada capa en múltiples conjuntos. Por lo tanto, en esta arquitectura candidata, tendríamos once ensamblajes, sin incluir las capas superiores.
Aquí está el desglose, con una descripción de cada conjunto:
Company.Project.Common.OperationalManagement
: Contiene componentes que implementan políticas de gestión de excepciones, la tala, los contadores de rendimiento, configuración y localización.Company.Project.Common.Security
: contiene componentes que realizan autenticación, autorización y validación.Company.Project.Common.Communication
: contiene componentes que se pueden usar para comunicarse con otros servicios y aplicaciones (básicamente un grupo de clientes WCF reutilizables).Company.Project.Business.Interfaces
: Contiene las interfaces y las clases abstractas que se usan para interactuar con la capa empresarial desde capas de alto nivel.Company.Project.Business.Workflows
: Contiene componentes y lógica relacionada con la creación y el mantenimiento de flujos de trabajo de negocios.Company.Project.Business.Components
: Contiene componentes que encapsulan las reglas comerciales y la validación.Company.Project.Business.Entities
: Contiene objetos de datos que son representativos de entidades comerciales de alto nivel. Algunos de estos pueden ser únicos, algunos pueden ser compuestos formados a partir de entidades de datos más granulares de la capa de datos.Company.Project.Data.Interfaces
: Contiene las interfaces y clases abstractas que se utilizan para interactuar con la capa de acceso a datos en un estilo de repositorio.Company.Project.Data.ServiceGateways
: Contiene clientes de servicio y componentes que se utilizan para llamar y recuperar datos de sistemas externos.Company.Project.Data.Components
: Contiene los componentes que se utilizan para comunicarse con una base de datos.Company.Project.Data.Entities
: Contiene entidades mucho más granulares que representan datos comerciales a un nivel bajo, adecuado para persistir en una base de datos u otra fuente de datos de forma transaccional.
Mi intención es que este sea un diseño de capas estrictas (una capa solo puede comunicarse con la capa directamente debajo) y la rotura modular de las capas debe promover una alta cohesión y un acoplamiento flexible. Pero todavía tengo algunas preocupaciones. Aquí están mis preguntas, que creo que son lo suficientemente objetivo de que sean adecuados aquí en SO ...
- son mis convenciones de nomenclatura para cada módulo y su respectiva asamblea siguientes convenciones estándar, o hay una manera diferente que debe estar yendo sobre esto?
- ¿Es beneficioso separar las capas comerciales y de datos en múltiples conjuntos?
- ¿Es beneficioso tener las interfaces y clases abstractas para cada capa en sus propios ensamblajes?
- MÁS IMPORTANTE - ¿Es beneficioso contar con un ensamblaje de "Entidades" tanto para el negocio como para las capas de datos? Mi preocupación aquí es que si incluye las clases que generará LINQ to SQL dentro de los componentes de acceso a datos, entonces una entidad determinada se representará en tres lugares diferentes en la base de código. Obviamente, herramientas como AutoMapper pueden ayudar, pero todavía no estoy al 100%. La razón por la que los he separado así es A - Aplicar una arquitectura de capas estrictas y B - Promover un acoplamiento más flexible entre capas y minimizar la rotura cuando ocurren cambios en el dominio comercial detrás de cada entidad. Sin embargo, me gustaría obtener orientación de personas que están mucho más experimentadas en arquitectura que yo.
Si pudiera responder a mis preguntas o señalarme en la dirección correcta estaría muy agradecido. Gracias.
EDIT: quería incluir algunos detalles adicionales que parecen ser más pertinente después de leer la respuesta de babuino. Las tablas de la base de datos también son un desastre profano y son cuasi relacionales, en el mejor de los casos. Sin embargo, no estoy autorizado a realizar una nueva arquitectura de la base de datos y a hacer una limpieza de datos: lo más profundo que puedo llegar es crear nuevos procs almacenados y comenzar a desaprobar los antiguos. Es por eso que me inclino por tener entidades definidas explícitamente en la capa de datos, para tratar de usar las clases generadas por LINQ a SQL (o cualquier otro ORM) ya que las entidades de datos simplemente no parecen factibles.
Actualización a partir del 2012-03-05: decidimos ir con una arquitectura de capas estrictas, como estaba previsto. Sin embargo, al final llegué a la conclusión de que tener las interfaces y las clases abstractas en su propio ensamblado era una complejidad añadida sin ningún beneficio real. Todavía estoy yendo con el enfoque de tener entidades comerciales separadas, que son distintas de las entidades en la capa de datos. Esto ha demostrado ser invaluable, ya que evita que los detalles abominables del esquema DB se filtren más allá de la capa empresarial. En otras palabras, ayuda dibujar una línea en la arena y se agrega protección. –