Como punto de partida os contare que actualmente mi equipo y yo, estamos desarrollando un sistema ERP para la empresa en la que trabajamos, lo hemos bautizado como «Maldivas», voy a describiros algunos de los procesos más interesantes que estamos implementando. Tratare de explicar el funcionamiento de aquellas partes que os parezcan más interesantes.
La arquitectura del sistema está basada en n-capas, utilizando como base el patrón Entity Data Model, «muy similar al EDM que Microsoft acaba de presentar», que pena que llevemos dos años de desarrollo y nos lo hayamos tenido que currar todo.
La capa de presentación está basada principalmente en librerías de controles personalizadas que utilizan controles de terceros de la marca «devexpress», para los interesados www.devexpress.com y por supuesto de algún control propio de .net, todos los formularios maestros heredan de un formulario base que realiza todas las llamadas de forma genérica a la capa de negocios.
La capa de negocios está basada en librerías de clases que principalmente interaccionan con la capa de datos y la de presentación, además de incorporar las reglas de negocio. Estas capas las hemos diseñado utilizando generics, por anticiparos algo realizamos llamadas de este tipo.
Manager<Clientes> manager = new Manager<Clientes>();
manager.GetAll(); me devolvería una colección de entidades de tipo cliente.
manager.Get(‘000001′) me devolvería una entidad de tipo cliente
manager.Get(Filters) me devolvería una colección de clientes filtrados por una o varias condiciones.
manager.Data.Nombre = «prueba»; Guardaria en la entidad el nombre de un cliente
manager.SaveChanges(); Salvaria los cambios en la base de datos.
Estas funciones generan en tiempo de ejecución sentencias sql de tipo:
SELECT [Nombre],[Apellidos]… FROM dbo.Interlocutores WHERE Tipo = ‘1′ // Clientes
o
UPDATE dbo.Interlocutores SET [Nombre] = «prueba» WHERE [Codigo]= ‘000001′ AND [Nombre] = @valorAnterior
En algunos casos podemos optimizarlas generando directamente los procedimientos almacenados para realizar la operación y cacheamos muchos de los datos que reutilizamos.
De esta forma minimizamos el código utilizado para trabajar con múltiples entidades, dedicare un post entero a mostraros esta arquitectura, ahora mismo estoy migrando parte para adaptar el EDM de Microsoft.
Posteriormente añadiremos otra capa basada en ws, para aprovechar reglas de negocios y funciones de la capa de acceso a datos que serán utilizadas en el sistema de comercio electrónico y los dispositivos móviles.
Como la aplicación no va orientada al público en general, es muy específica para el sector en el que trabajamos, decidimos centrarnos únicamente en Sql Server y aprovechar al máximo su potencial, utilizamos procedimientos almacenados de forma masiva y muchas de las características propias sql como particionamiento de tablas, funciones, triggers, sinónimos y otros aspectos propios de la base de datos, creando una dependencia total con el Software de Base de datos.
Sé que hoy en día y con las arquitecturas existentes, así como las maneras diferentes que existen de abordar un problema, muchos no estarán de acuerdo con esta arquitectura, alguna persona me ha preguntado, ¿Como no lo hicisteis todo en aspx utilizando ws ? o ¿ Como no utilizáis Entreprise Library para crear un acceso más independiente de la base de datos ? o ¿ Por qué no habéis desarrollado toda la parte de la capa cliente en WPF en lugar de Windows Forms ? , etc.
Tratare de explicar porque hemos tomado estas decisiones, además de los errores y aciertos que hemos cometido a lo largo del proceso de desarrollo, aspectos relacionados con el trabajo en equipo, diseño, adopción de herramientas, y otros que os darán una perspectiva amplia de los proyectos con los que trabajamos. Dedicare también algún post a hablar de las herramientas que utilizamos en el desarrollo (TFS, Team Suit, Team for Database Professional, CodeRush, Refactor, Resharper, Pruebas Unitarias, fxCop, Herramientas de generación de código propias utilizando Codedoom, etc), y un poco sobre algún aspecto de la metodología de trabajo utilizada en este proyecto «Scrum».
Me gustaría mucho oír vuestras opiniones y críticas al respecto.
Siempre me ha gustado «fisgar» las aplicaciones de los demás, de ellas he sacado la mayoría de las funcionalidades que implemento en los programas que desarrollo. Como una imagen vale más que mil palabras os dejo algunos formularios del programa que iré desgranando en los sucesivos post, espero que os gusten.