La mejor arquitectura para la aplicación ASP.NET WebForms


10

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.

  1. ¿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.

  2. ¿Existe una forma sólida de autogenerar DTO / BO para que las mejoras futuras sean simples de implementar a pesar de las capas adicionales?

  3. ¿Sería beneficioso convertir el proyecto de WebForms a MVC?


1
Libertad anticipada, la liberación a menudo. Sugiero que a su cliente no le importe tanto si no tiene problemas comerciales tangibles que presentar (por ejemplo, es inseguro). Tal vez deberías limpiar un poco (asegúrate de que sea portátil) y liberarlo, luego tomar esto como una iniciativa a largo plazo, para transformarte en MVC o similar.
gahooa

2
No cambie la tecnología de su proyecto de trabajo a la nueva tecnología xyz solo porque está allí, especialmente si su proyecto funciona bien como está. Si está funcionando no lo rompas. A las empresas no les importa el código. La funcionalidad es todo lo que importa al final del día.
NoChance

ok, eso es cierto, sin embargo, mi preocupación es que, una vez que se lance, será más difícil refactorizarla debido al riesgo de romperla cuando las apuestas son mucho más altas. Por lo tanto, estaríamos atrapados con un código que no es tan fácil de mantener y más difícil de depurar, etc. Estuve tentado de aprender / convertir a MVP pero eso parecía demasiado trabajo. Hasta ahora lo acabo de convertir a DAL, Dominio, capas de IU que se sienten más organizadas y aún así permiten el RAD inevitable que se necesitará mientras el proyecto sea joven. Un día, si es necesario, puedo expandirme a MVP o MVC, supongo, después de tener suficiente tiempo para aprender cómo funciona todo.
apilar hombre

Lo que aún se siente desordenado es: 1) Objetos EF en la interfaz de usuario (código detrás de los archivos en la capa de la interfaz de usuario)
stack man

(2) Lógica empresarial en objetos EF extendidos que tenían que ir en la capa DAL (no se dio cuenta de que las clases parciales tenían que estar en el mismo ensamblaje) (3) Lógica empresarial dentro de los archivos aspx.cs en la capa UI. Sin embargo, parece que a menudo hay compromisos cuando se trata de arquitectura, pero este es ciertamente un paso adelante. Siento que esto es aceptable para la primera versión y, a medida que pasa el tiempo, podemos reevaluar nuestro enfoque. Gracias por su ayuda a todos. Es bueno obtener un poco de dirección ya que esta área es muy subjetiva.
apilar hombre

Respuestas:


5

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


El problema es que requeriría mucho trabajo refactorizar el proyecto a MVC ... si lo mantengo como una aplicación de WebForms con Domain Layer (código primero, POCO), Data Access Layer (solo contexto db) y UI, ¿Consideras que este es un diseño aceptable para la producción? En una fecha posterior, podríamos considerar convertirlo a MVC, supongo.
stack man

Bueno, es un patrón MVP (modelo-vista-presentador) y NO un MVC (modelo-vista-controlador).
Yusubov

1
oh lo siento, lo leí mal. Gracias, leeré sobre el diseño MVP.
stack man

no hay problema, espero que encuentres lo que buscas :)
Yusubov

Parece que la conversión a MVP también sería un cambio importante. El cliente quiere lanzarlo muy pronto, entonces, ¿cree que la arquitectura DAL / DA / UI mencionada anteriormente (aunque no es tan ideal como MVP) sería aceptable para este tipo de aplicación? Luego, después del lanzamiento, podríamos considerar pasar a MVP en v2.
stack man

1
  1. Use el patrón MVP para separar y la lógica y la interfaz de usuario, por lo que en el futuro puede pasar a una tecnología de interfaz de usuario diferente reutilizando la lógica existente
  2. Use el patrón de repositorio entre BL y DAL para que pueda cambiar a cualquier RDBS reutilizando la lógica de negocios
  3. traiga capas separadas (Dlls) para BO y DAL, lo que minimiza el mantenimiento.

No estoy seguro de por qué alguien rechazó esta pregunta. Para ser honesto, esta es la respuesta más concisa. +1
Greg Burghardt

0

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 .


Gracias por tus útiles consejos. Sí, ciertamente estoy un poco abrumado con esto. Me parece que MVC sería el mejor patrón para usar, pero MVP sería más fácil de lograr y sería el siguiente mejor patrón. Siempre he usado el código detrás de los archivos, así que siempre me rasgué la cabeza acerca de cómo la lógica empresarial se puede separar de la presentación ... por lo que debería poder mover esencialmente mis archivos .aspx.cs a la capa de dominio y tener una declaración de herencia en el aspx ? Ciertamente, terminar con 3 capas me haría sentir cómodo lanzando la primera versión, entonces puedo mejorarla desde allí.
stack man

Responderé a tu comentario en mi respuesta. Siéntase libre de votar mi respuesta si la encuentra útil
codificador
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.