He escrito un portal ASP.NET WebForms para un cliente. El proyecto ha evolucionado en lugar de estar adecuadamente planificado y estructurado desde el principio. En consecuencia, todo el código se combina dentro del mismo proyecto y sin ninguna capa. El cliente ahora está contento con la funcionalidad, por lo que me gustaría refactorizar el código de modo que tenga la seguridad de lanzar el proyecto. Como parece haber muchas formas diferentes de diseñar la arquitectura, me gustaría tener algunas opiniones sobre el mejor enfoque a seguir.
Funcionalidad
El portal permite a los administradores configurar plantillas HTML. Otros "socios" asociados podrán mostrar estas plantillas agregando código IFrame a su sitio. Dentro de estas plantillas, los clientes pueden registrarse y comprar productos. Se implementó una API utilizando WCF que permite a las compañías externas interactuar con el sistema también. Una sección de administración permite a los administradores configurar varias funciones y ver informes para cada socio. El sistema envía facturas y notificaciones por correo electrónico a los clientes.
ARQUITECTURA ACTUAL
Actualmente está usando EF4 para leer / escribir en la base de datos. Los objetos EF se usan directamente dentro de los archivos aspx. Esto ha facilitado el desarrollo rápido mientras escribía el sitio, pero probablemente sea inaceptable mantenerlo así, ya que está estrechamente acoplado a la base de datos con la interfaz de usuario. Se ha agregado lógica empresarial específica a clases parciales de los objetos EF.
PREGUNTAS
El objetivo de la refactorización será hacer que el sitio sea escalable, fácil de mantener y seguro.
¿Qué tipo de arquitectura sería mejor para esto? Describa qué debe haber en cada capa, si debo usar el patrón DTO / POCO / Active Record, etc.
¿Existe una forma sólida de autogenerar DTO / BO para que las mejoras futuras sean simples de implementar a pesar de las capas adicionales?
¿Sería beneficioso convertir el proyecto de WebForms a MVC?
Respuestas:
El patrón ASP.NET MVP es la mejor arquitectura para una aplicación de formularios web ASP.NET a largo plazo . Está entrando en juego con el concepto de "separación de preocupaciones", que es de hecho una tendencia detrás de los patrones MV *.
La pregunta sobre ¿Por qué usarlo? - abordado en detalles en esta publicación - ASP.NET MVP
fuente
fuente
Como mencionó ElYusubov, el patrón MVP puede ser excelente.
El concepto clave es eliminar la mayor parte o toda su lógica del código subyacente. La lógica no debe estar vinculada a una página. ¿Qué sucede si necesita reutilizar la lógica de una página en otra? Tentarás a copiar y pegar. Si está haciendo esto, su proyecto será mantenible.
Entonces, para empezar, comience a refactorizar su lógica del código subyacente y colóquela en una capa empresarial. Si logró sacar toda la lógica del código subyacente, entonces podría implementar las interfaces necesarias para ser un verdadero MVP.
También asegúrese de que su acceso a datos esté separado de su lógica comercial. Cree una capa de datos y comience a refactorizar también en ese extremo. Dado que está utilizando EF4, este es un problema menor, ya que EF ya debería tener este extremo separado. Debería poder mover fácilmente todos sus archivos EF a otro proyecto y simplemente agregar una referencia a los proyectos que lo necesitan. El beneficio adicional es que puede necesitar hacer referencia a su modelo de datos en otros proyectos.
Para evitar sentirse abrumado, refactorice un poco a la vez. Cada vez que toque un fragmento de código, considere refactorizar el código que lo rodea. Si hace esto, con el tiempo su proyecto puede ser más fácil de mantener.
Editar
Usted preguntó acerca de tener el código detrás de heredar una clase de lógica de negocios. Esto no se puede hacer porque el código detrás de la página "es-a". C # no permite la herencia múltiple, por lo que la clase de código subyacente no puede ser tanto una página como un objeto personalizado. Necesita separar conceptualmente la lógica. Probablemente sea el caso de que el código en su código subyacente está haciendo muchas cosas diferentes. Una clase debe hacer una cosa y solo una cosa. Pruebe y piense cómo puede extraer conceptualmente la funcionalidad existente. Por ejemplo, supongamos que tiene una página de registro y está recopilando información del usuario. Probablemente tenga un botón llamado registrarse y un evento de clic asociado con ese botón. En ese caso, está guardando la información del usuario y haciendo el procesamiento que necesita. Podría crear un objeto de registro para manejar toda esa lógica.
Esto no solo es una separación más limpia, sino que también puede ser una forma de documentar su código. Cuando alguien lee su código, lo ven llamando a un objeto de Registro para que sepa exactamente lo que está sucediendo.
Si desea seguir estrictamente el patrón MVP, en lugar de pasar los parámetros al objeto Registro, el código subyacente implementaría una interfaz. La implementación de la interfaz esencialmente mapearía todos los objetos de vista (campo de texto, etc.) a la interfaz. ej., cadena pública FirstName {get {return txtFirstName.Text; }}
Una vez hecho esto, puede pasar la página al objeto de Registro
Registration.RegisterUser (este);
Y este método RegisterUser tomaría la interfaz como parámetro
public bool RegisterUser (usuario de IUser) {user.FirstName ...}
Interfaz pública IUser {public string FirstName; }
Si este MVP suena confuso, solo enfóquese en la refactorización y sepa que el objetivo de todo esto es maximizar la reutilización del código. No hay desde entonces en repetirse. Ese es el director SECO .
fuente