Arquitectura en tres capas con ASP.Net
Existe en MSDN un interesante tutorial sobre como crear aplicaciones Asp.Net en tres capas. Sin duda el enfoque presentado en el artículo es adecuado para aplicaciones pequeñas y medianas, pero voy a comentar algunas mejoras que yo haría y por qué. Estas mejoras que propongo son practicamente obligatorias si se trata de la arquitectura de una aplicación empresarial.
Sería interesante exponer la capa de negocio a través de una fachada de servicios web, o lo que es lo mismo ir a una arquitectura en cuatro capas. La motivación es desvincular completamente la capa de interfaz de usuario de la capa de negocios, y no cerrarnos la puerta a la posibilidad de tener una interfaz que no este basada en Asp.net o poder elegir un enfoque "Smart Client".
Otra mejora necesaría seria, a mi modo de ver, separar totalmente los objetos contenedores de datos (DataSet) de la lógica de actualización de los mismos (TableAdapter). Esto permite desacoplar estos dos conceptos completamente. La capa de servicios web, necesita conocer los objetos contenedores de datos y los objetos de negocio, pero para nada los objetos de acceso a datos. Si no separamos estos dos conceptos, la fachada de web services tendrá acceso directo a los TableAdapter. Para esto sería necesario abandonar los TableAdapter y utilizar DataAdapter en su lugar, pues estos no no están directamente vinculados con los DataSet. Una gran mejora a futuro sería que el asistente que genera los DataSet y sus DataTable asociados permitiese elegir que se generasen en ensamblados separados, ahora, hasta donde yo se, esto no se puede hacer.
Un error habitual cuando, que el tutorial no comente, pero que voy a comentar aqúi, es hacer toda nuestra capa de acceso a datos y de negocios con clases estáticas, esto no es malo en principio, pero el problema cuando se elije este enfoque es que tendemos a almacenar la conexión como un miembro estático de nuestras clases y esto va contra la práctica que abrir tarde la conexión, cerrarla pronto y no compartirla entre operaciones.