arquitectura de la web: MVC, Lazy inicialización, la transferencia de objetos de datos, la sesión abierta en la vista, no es un enfoque de consenso?

StackOverflow https://stackoverflow.com/questions/1969278

Pregunta

¿Qué hacer defectos que se ve en el siguiente diseño, (y lo que sería su sugerencia ideales arquitectura) para una aplicación web típica de 3 niveles?

Mi enfoque modelo actual es muy áspero (asumiendo Java, Spring, Hibernate, JSP)


Controller

Stateless, potencialmente envuelto con una lectura única transacción (para evitar excepciones init perezoso), entidades de Get de almacenamiento de persistencia a través de sólo el servicio, los pasa a la vista como el modelo. la lógica lleva a cabo negocios en ellos (debe ser la BL en la capa de servicio sólo?), pasa de nuevo a la capa de servicios para la persistencia si es necesario.

Pros : para envolver transacciones de sólo lectura - sólo una conexión, no hay accesos redundantes para la misma entidad persistente, utiliza la caché de consultas mejor, capa de servicios no debe "saber" parámetros de la petición, o requerido lapso gráfico init, evitar excepciones init perezosas.

Contras : El enfoque de transacciones de sólo lectura puede ser arriesgado, los controladores no son el ideal de lógica de negocios que cuelga lugar ... muy difícil de hacer JUnits (su entrada es una petición ...)


Ver

No transaccional (acceso a las colecciones no perezosos / miembros resultará en una excepción init perezoso)

Pros

  • La vista autor no debe afectar por mera dot notación el rendimiento de la aplicación (por ejemplo, causa N + 1 selecciona debido a inicializar perezoso una gran colección.

  • También en clientes desconectados (Flex, u otros clientes ricos) inicialización perezosa de forma remota es o no compatible, o simplemente no es una cosa elegante a hacer

Contras : el controlador / servicio / DAO deben preparar cuidadosamente el gráfico de la derecha de las entidades para la vista, y puede ser rebasamiento (rendimiento) / undershooting (excepción init perezoso). una miríada de métodos del lado del servidor puede causar el desorden, ya que es un producto cartesiano para el número de permutaciones un gráfico entidad se puede inicializar


Modelo

El uso de los objetos persistentes como es, (objetos no hay transferencia de datos), el estado se guarda en la sesión.

Pros . Sin necesidad de reescribir POJOs, la reutilización de las entidades existentes, el estado de sesión es más seguro que el manejo del estado campos ocultos

Contras . Malo para marcos desconectados, el riesgo de guardar objetos desconectados rancios, el riesgo de problemas de bloqueo, haciendo caso omiso de otros datos, requiere el bloqueo optimista veces


Servicio

transaccional, no conoce el ámbito de la petición, llama a una capa DAO para el acceso al almacenamiento persistencia real. aquí es donde el BL debe ser clásicamente, pero parece que los escapes BL al lado del controlador de una y otra.


DAO

Contiene fachada de almacenamiento persistencia atómica, ignorante de la BL, o cualquier contexto


Por último, la pregunta:

¿Qué le fijar en la arquitectura anterior?

¿Cree usted que (como yo) es un enfoque bastante común (con algunas diferencias menores, como la sesión abierta en la vista, etc)? O se trata de la primera vez que lo veo y estoy haciendo algo muy malo (o derecha)?

¿Cómo resolver en sus aplicaciones? ¿Utiliza POJOs entidad también para su modelo y la vista? o no de que conecte a los granos de la interfaz de usuario más simple (todas ellas completamente inicializado y seguro)?

Esto puede ser una cuestión subjetiva, pero estoy seguro de que hay claros patrones mejores prácticas de diseño que clúster a uno, dos o tres max "religiones" generales.

¿Fue útil?

Solución

En general, parece como una muy buena arquitectura. Si aún no lo ha leído, yo recomendaría Patrones Martin Fowlers de arquitectura de aplicación empresarial, que describen cada sujeto en su pregunta.

No está claro a partir de la pregunta qué tan grande un problema que esperan que el rendimiento sea. En mi experiencia, los cuellos de botella de rendimiento son raramente donde se piensa que son, y cuanto antes se los encuentra, más fácil es cambiar la arquitectura de igualar.

Tienes razón en que la capacidad de prueba es una preocupación importante. He utilizado Martin Fowler pasiva Ver -pattern con cierto éxito. También debe echar un vistazo a Supervisar controlador, desde el mismo sitio.

Otros consejos

Super menos que con un front-end estilo Sofea, que básicamente se deshace de la parte del Controlador de la arquitectura anterior.

La parte delantera está totalmente contenida en el cliente, que guarda relación directa servicios REST o SOAP que regresan JSON o XML. Eso parece solucionar 100% del problema con la transformación de objetos de dominio para su visualización !!!!

Tal vez, algunos sugieren, la razón no hay una solución clara a la arquitectura de N-capas descrito anteriormente se debe a que es un error normal.

Enlaces

  1. http://raibledesigns.com/rd/entry/sofea_also_known_as_soui
  2. http://www.theserverside.com/news/thread.tss ? thread_id = 47213
  3. http://wisdomofganesh.blogspot.com/2007 /10/life-above-service-tier.html

Mi proyecto actual utiliza una arquitectura de n niveles algo pasada de moda con la transferencia de datos de objetos. Las DTO son innecesarias porque la aplicación no se distribuye y nunca lo será. El único beneficio (que no vale la pena OMI) de utilizar el DTO es que obliga a una interfaz limpia para los métodos de negocio - los componentes de vista pueden atravesar el gráfico de objetos en los pseudo-modelos como desee - sin excepciones perezoso-inicialización puede ser lanzado.

Uno de los puntos de dolor arquitectónicos que veo en nuestra arquitectura es que las interfaces de negocio son dos condenados complicado. Parece como si necesitamos una interfaz de meta-negocio para encapsular todas las interfaces de negocios pequeños. De hecho, esto termina sucediendo dónde termina un servicio llamando a otros tres servicios para hacer su trabajo.

Los controladores (en nuestro caso, Struts 1.2 clases de Acción) terminan llamando a cualquier combinación de estos ultra-fino de grano o componentes de negocio de grano grueso. En la mayoría de los casos, por desgracia, los desarrolladores, sin saberlo, o con pereza codifican una variedad de lo que debería ser la lógica de negocio en las clases de controlador. Yo grito cada vez que miro en uno de estos tres métodos de cien línea de acción !!!!

El enfoque Sofea parece ofrecer un enfoque más limpio mucho. AJAX permite que las aplicaciones web que se ejecutan en los navegadores incluso a tener su extremo delantero codificado utilizando el patrón MVC adecuada, lo cual es bueno tanto para los usuarios (al ofrecer una interfaz de usuario más dinámica) y desarrolladores (lo que les permite código apropiado MVC).

La interfaz de usuario está completamente desacoplada de la lógica de negocio reutilizable. Es la interfaz gráfica de usuario gruesa o delgada? Realmente no importa -they'll ser codificado básicamente de la misma manera.

Sofea / Soui es nuevo para mí y nunca he probado, pero he estado leyendo sobre él últimamente y pensé que me gustaría compartir mis pensamientos.

Su enfoque por encima de sonido buena.

Sin embargo, creo que se debe utilizar la interfaz de usuario-Frijol. Por supuesto, esta interfaz de usuario Bean debe ser efectivamente inmutable. Tan pronto como se crea su estado (y el objeto de dominio encapsulado) no debe ser cambiado.

ejemplo muy simplificado:


class UIBean {
  DomainObject o;

  public String getDescription(){
     return trimToSummaryText(o.getDescription());
  }

  private static String trimForSummaryText(){
     ....
  }
}

Principales ventajas:

  • Plantilla de código tiende a ser más limpio y conciso. Su Frontend-desarrollador estará feliz con esto.
  • No tienden a añadir métodos de interfaz específica de ayuda para las clases de objetos de dominio.
  • agrupación de diferentes objetos de dominio o ver en grano es posible (ui-bean podría tener múltiples campos). La encapsulación de las listas es especialmente agradable aquí.

Sí, se trata de más de java-clases para eso. Sin embargo, esta capa de abstracción es casi siempre bien tan pronto como su aplicación web y páginas crecen.

A pesar de la última pregunta fue respondida hace unos años, tal vez la respuesta parece útil a alguien. En general esbozado por que la arquitectura está muy bien, el único detalle a añadir es: por lo general para pasar datos entre capas (por ejemplo, vistas y servicio) en lugar de antes mencionados UiBean-S llamado dtos (objetos de transferencia de datos) se utilizan, estos son lisos con POJOs apropiadas campos / set / captadores.

En una de las versiones anteriores / principios de especificación Java EE "DTO" término fue mezclado por error con "ValueObject", aunque tienen poco diferentes propósitos.

Hope, esto ayuda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top