ASP.NET MVC: ¿deberían los MVC M, V y C ser explícitamente conscientes de las entidades de dominio?

8

Como esta pregunta parece ser bastante subjetiva, la publico aquí.

Digamos que usted está escribiendo su propia versión de Stackoverflow usando ASP.NET MVC, por lo que hay clases como Question, Answer, User, etc Dado que usted es perezoso, ha decidido usar marco de la entidad. Por lo tanto, todas las clases mencionadas anteriormente tienen propiedades de navegación: Questionconoce sus Answers, Answersabe Userquién lo publicó, etc.

Usted ha leído muchos libros de Martin Fowler, por lo que seguramente tendrá una capa de servicio para implementar toda la lógica de negocios allí. Utilizará ASP.NET MVC solo para la interfaz de usuario y la funcionalidad relacionada con la lógica de la aplicación.

Hay 2 preguntas:

  1. Va a exponer directamente los objetos de Question, Answery otros a los controladores?
  2. ¿Harás lo mismo para las vistas?

Básicamente, no voy a proporcionar una API REST a mi aplicación, ni soy demasiado conservador para tener miedos como "oye, MI VISTA es consciente de lo que Questiones, no sé si es malo o no, ¡Simplemente no me gusta! ".

Tengo especial curiosidad sobre el caso cuando la Questionclase tiene un campo como TimePostedy vincula su PostNewQuestionvista a esa clase. Sé que en caso de que no enlace ese campo a ningún control de la página, no se publicará, por lo que tendré ese campo configurado nullcuando tenga el objeto en el lado de mi controlador. ¿Se considera bien o es una mala idea? Dos enfoques opuestos en los que estoy pensando son "usar DTOs / ViewModels en todas partes" y "¡Wtf, menos clases siempre es mejor!"

¿Cuál crees que es un enfoque correcto ? (Sé que no hay una respuesta directa, por lo que la pregunta es "¿qué se debe considerar para decidir si usar DTO / ViewModels / Cualquier otra cosa es buena para la arquitectura de su aplicación?")

También tenga en cuenta que estamos considerando un clon muy simplificado de Stackoverflow, así que:

  1. Es un proyecto solo web (no vamos a exponer REST API o cualquier otra cosa)
  2. Hay usuarios, preguntas, respuestas, etiquetas y funcionalidad de búsqueda (sin lógica de negocios excepcional)
  3. Hay como 100 usuarios activos por día (sin requisitos especiales de rendimiento)
  4. El código debe ser legible y no debe haber sorpresas o lugares de especial interés en caso de que un nuevo miembro se una al equipo de desarrollo.

También puede expresar su opinión en caso de que alguno de los primeros 3 puntos cambie: "el cliente ahora quiere que nuestro servicio permita 10000 usuarios simultáneos" o "ahora solo debemos permitir que cada usuario publique una vez cada 15 minutos", etc.

¡Gracias!

Andrey Agibalov
fuente

Respuestas:

3

No he trabajado mucho con MVC, sin embargo, he trabajado mucho con MVVM y aquí está mi opinión:

Question, Answery Userson todos los objetos de datos. Está bien que se conozcan, pero no deben estar al tanto de nada fuera de la capa del objeto de datos, como Vistas, Controladores, Modelos de vista, etc.

En un mundo ideal, su Vista solo hace referencia a los Modelos. Es posible que conozcan el controlador, pero no deberían tener que consultarlo directamente. ViewModel solo conoce otros modelos. El controlador sabe acerca de modelos y modelos de vista. La vista no le importa en absoluto, aunque la proporciona con modelos o modelos de vista.

Entonces tus objetos terminan luciendo así:

  • Los modelos vienen en dos variedades: modelos y modelos de vista.

    • Los modelos son objetos de datos simples que simplemente existen para contener datos, y generalmente son un reflejo de los datos de la base de datos. No acceden a la base de datos ni contienen ningún tipo de lógica empresarial que no esté relacionada con ellos.
    • Los ViewModels son objetos de datos que contienen datos que la Vista necesita, no necesariamente lo que necesita la base de datos. Pueden contener modelos, aunque los modelos no deben contener modelos de vista.
  • Los controladores C contienen su lógica empresarial. Controlan las llamadas de acceso a datos, creando Modelos / Modelos de vista para pasar a la Vista, lógica empresarial avanzada como permisos, etc. Básicamente controlan toda la capa de código.

  • Las vistas solo se utilizan para proporcionar a los usuarios una interfaz fácil de usar. Aceptan un modelo o modelo de vista, y lo muestran de una manera que se ve bien para el usuario.

Rachel
fuente
MVVM realmente no tiene sentido en un proyecto web ...
yannis 03 de
1
@YannisRizos Esto no es MVVM, es MVC. MVC también tiene ViewModels, pero son parte de la capa Modelo. Son esencialmente modelos para las vistas, no su propia capa que contiene lógica empresarial (que es lo que serían en MVVM). En realidad, no recomendaría usar MVVM a menos que esté trabajando con WPF / Silverlight.
Rachel