vista tutorial net mvc modelo las form español ejemplos controlador capas asp arquitectura aplicaciones c# .net asp.net asp.net-mvc design-patterns

tutorial - mvc c# windows forms



¿Cuál es el mejor lugar para la lógica de negocios en ASP.NET MVC cuando se usan repositorios? (5)

En mi opinión, depende de la lógica comercial. Es la lógica basada en la validación de las reglas de entrada y entrada, de ser así, puede ser mejor estar en el modelo. Sin embargo, si se trata de reglas comerciales basadas en el flujo de trabajo, puede ser necesario que estén en un controlador, por ejemplo, si el usuario elige la opción A, luego se redirige a una página / formulario diferente que si se seleccionó la opción B. Si las reglas de negocio tienen que lidiar con la persistencia de los datos, es posible que deba ir al repositorio (Me parece extraño ponerlo a mi disposición). Hay mucho debate sobre esto, pero depende de usted o de la perspectiva de su equipo sobre cómo el producto final se mantendrá y será flexible en función de la implementación.

Al implementar el Repositorio para la base de datos en el proyecto ASP.NET MVC, ¿es correcto colocar la lógica de negocios en él o puede ser mejor colocar la lógica en la clase de controlador? ¿O utilizar servicio adicional y clases de ayuda para manipular datos?


Agregue una capa de servicio para pasar modelos al repositorio, donde se pueden agregar las clases de servicio correspondientes al controlador. Por ejemplo, si usa un UserController y un modelo de usuario, puede pasar el modelo de usuario a la clase UserService.

Aquí, la capa de servicio puede actuar como un puente entre el repositorio y el controlador para que la separación entre el controlador y el repositorio esté bien establecida.


Estoy de acuerdo con lo anterior, los controladores no deberían ser responsables de la lógica comercial simplemente por devolver las vistas apropiadas. Utilizo una capa de servicio para proporcionar lógica comercial y ver la creación del modelo de modo que un controlador simplemente pase el modelo devuelto de un servicio a una vista.

También me aseguro de que mis modelos de vista sean DTO simples, y el servicio simplemente sabe cómo poblar las propiedades de manera apropiada.


En última instancia, no hay un lugar perfecto para su lógica de negocios además de su propia capa (como parte de la capa "Modelo"). A menudo puede salirse con la suya con una implementación diferente, pero hay compensaciones en todos los casos.

La compensación para crear otra capa para la lógica de negocios es que tienes que encapsular tu código. Si eres demasiado agresivo, también podrías obtener alguna duplicación entre tus entidades y tu modelo de dominio (si la semántica relacional de tu DB ya se ocupa de tu lógica de negocios).

Ver

La vista es la parte más frágil de su aplicación, ya que es la parte más probable de cambiar.

También es muy difícil lograr que la lógica de negocios sea correcta en su opinión, debido a que tiene que soportar todas las diversas transiciones de estados de vista.

Es extremadamente bien conocido en estos días que simplemente no lo hagas :)

Repositorio

El problema aquí es el mantenimiento y la pureza de la abstracción. La violación de esto puede confundir a las personas y hacer que su aplicación sea difícil de mantener.

Del artículo P de EAA sobre el patrón Repositorio :

Un repositorio media entre el dominio y las capas de mapeo de datos, actuando como una colección de objetos de dominio en memoria

Un repositorio es una abstracción que presenta su almacenamiento de datos como una colección que contiene objetos de dominio.

No debe residir en ella lógica de dominio. En cambio, debería existir en los objetos de tu dominio (por definición, ya que tu lógica de negocio es tu dominio).

Hacer lo contrario (hacer que tu repositorio haga doble función y también validar la lógica de dominio) sería una violación de SRP ( principio de responsabilidad única ), y sería un olor a código.

Puede tener objetos de dominio de nivel superior que funcionen con colecciones de objetos de dominio para validar la lógica de dominio (como las dependencias dentro de una colección de objetos, límites de tamaño, etc.). Todavía usarán sus repositorios bajo las cubiertas para hacer el almacenamiento / recuperación final de los objetos de dominio, por lo que no harán doble tarea (por lo tanto, no violarán a SRP).

Controlador

El controlador tampoco es un buen lugar para poner lógica de negocios. El trabajo del controlador es mediar entre el controlador y el modelo.

El modelo es el dominio y el dominio es su lógica comercial.

Entidades

Puede considerar poner datos de dominio en entidades.

Pero debe tener cuidado al acceder a las propiedades de navegación si las entidades están adjuntas, ya que puede desencadenar consultas o excepciones de DB inadvertidas (dependiendo de si su contexto está dispuesto o no). Separarlos también es un problema, ya que destruye el gráfico de objetos a menos que vuelva a vincular explícitamente los objetos entre sí después de separarlos del contexto.

Si crea clases de modelo de dominio por separado, podría considerar tratar entidades solo como DTO .

Editar: IValidatableObject

Descubrí hace poco sobre una característica en Entity Framework 4.1 que quizás desee verificar: la interfaz IValidatableObject .

Puede hacer que sus entidades sean clases parciales, y en la clase parcial, implementar esta interfaz. Cuando lo haga, Entity Framework llamará a Validate al guardar, y puede llamar a Validate siempre que tenga sentido hacerlo.

Esto podría ayudarlo a evitar dividir su modelo de persistencia de su modelo de dominio en casos adicionales.

Vea este artículo: http://msdn.microsoft.com/en-us/data/gg193959

Nota al margen: Vistas / Ver Modelos

En caso de que esté pensando en ello, le sugiero que evite la tentación de pasar las entidades a la vista. Se romperá en muchos casos (p. Ej., Serialización de Javascript para almacenar el estado de visualización) y provocará consultas de DB no intencionales en otros casos. En su lugar, devuelva tipos simples (cadenas, ints, listas, hashsets, diccionarios, etc.) o cree clases de modelos de vista para pasar a la vista.