ASP.NET MVC: ¿deberían el M, V y C del MVC tener conocimiento explícito de las entidades de dominio?

8

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

Digamos que estás escribiendo tu propia versión de Stackoverflow usando ASP.NET MVC, así que hay clases como Question , Answer , User , etc. Ya que eres perezoso, decidiste usar la entidad marco de referencia. Entonces, todas las clases mencionadas anteriormente tienen propiedades de navegación: Question conoce su Answer s, Answer sabe el User que lo publicó, etc.

Has leído un montón de libros de Martin Fowler, así que seguro que vas a tener una capa de servicio para implementar toda la lógica de negocios allí. Utilizará ASP.NET MVC solo para la UI y la funcionalidad relacionada con la lógica de la aplicación.

Hay 2 preguntas:

  1. ¿Expondrás directamente los objetos de Question , Answer y otros a los controladores?
  2. ¿Harás lo mismo con las vistas?

Básicamente, no voy a proporcionar una API REST a mi aplicación, ni soy demasiado conservador para tener miedos como "hey, MY VIEW es consciente de lo que es Question , no sé si es malo o no, simplemente no me gusta! ".

Tengo especial curiosidad por el caso cuando la clase Question tiene un campo como TimePosted y vinculas tu vista PostNewQuestion a esa clase. Sé que en caso de que no esté vinculando ese campo a ningún control en la página, no se publicará, por lo que tendré ese campo configurado en null cuando tenga el objeto en el lado del controlador. ¿Se considera bien o es una mala idea? 2 enfoques opuestos en los que estoy pensando son "usar DTO / ViewModels en todas partes" y "¡wtf, menos clases siempre es mejor!"

¿Qué crees que es un enfoque correcto ? (Sé que no hay una respuesta directa, por lo que la pregunta en realidad es "¿qué se debe considerar para decidir si usar DTOs / ViewModels / cualquier otra cosa es bueno para la arquitectura de su aplicación?")

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

  1. Es un proyecto solo para la web (no vamos a exponer la API REST o lo que sea)
  2. Hay usuarios, preguntas, respuestas, etiquetas y funcionalidad de búsqueda (sin lógica de negocios destacada)
  3. Hay como 100 usuarios activos por día (sin requisitos de rendimiento especiales)
  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 sus opiniones en caso de que alguno de los primeros 3 puntos se modifique: "el cliente ahora quiere que nuestro servicio permita a 10000 usuarios simultáneos" o "ahora solo debemos permitir que cada usuario publique una vez cada 15 minutos" , etc.

¡Gracias!

    
pregunta Andrey Agibalov 02.12.2011 - 21:45

1 respuesta

3

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

Question , Answer y User son todos los objetos de datos. Está bien que se conozcan entre sí, pero no deben conocer nada que se encuentre 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 al Controlador, pero no deberían tener que hacer referencia a él directamente. El ViewModel solo conoce otros modelos. El Controlador conoce los Modelos y ViewModels. No le importa la Vista en absoluto, aunque proporciona la Vista con Modelos de Vista o Modelos.

Entonces, tus objetos terminan pareciéndose a esto:

  • M los odels vienen en dos variedades: Modelos y ViewModels.

    • 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.
  • C los controladores contienen su lógica empresarial. Controlan las llamadas de acceso a datos, crean Modelos / ViewModels para pasar a la Vista, lógica empresarial avanzada como permisos, etc. Básicamente controlan toda la capa de código.

  • V las vistas solo se utilizan para proporcionar a los usuarios una interfaz fácil de usar. Aceptan un ViewModel o un Modelo, y lo muestran de alguna manera que se vea bien para el usuario.

respondido por el Rachel 02.12.2011 - 22:30

Lea otras preguntas en las etiquetas