model view controller - net - en MVC/MVP/MVPC, ¿dónde ubicas tu lógica de negocios?
mvc ejemplos (6)
¡Por el amor de Dios, ponlo en el modelo!
Por supuesto, parte de la interacción del usuario tendrá que estar en la vista, que estará relacionada con su aplicación y lógica comercial, pero evite esto tanto como sea posible. Irónicamente, seguir el principio de hacer tan poco como sea posible, ya que el usuario está "trabajando" en su GUI y tanto durante las solicitudes de ''envío'' o de acción, mejora la usabilidad y la experiencia del usuario, y no al revés. Al menos para aplicaciones de línea de negocio.
en el patrón de diseño MVC / MVP / MVPC, ¿dónde ubicas tu lógica comercial? No, no me refiero a ASP.NET MVC Framework (también conocido como "Tag Soup").
Algunas personas dicen que debes ponerlo en el "Controlador" en MVC / MVPC o "Presentador". Pero, otros piensan que debería ser parte del Modelo.
¿Qué piensas y por qué?
Así es como lo veo:
El controlador es para la lógica de la aplicación; lógica que es específica de cómo su aplicación quiere interactuar con el dominio del conocimiento al que pertenece.
El modelo es para lógica que es independiente de la aplicación. es decir, lógica que es válida en todas las aplicaciones posibles del dominio del conocimiento al que pertenece.
Por lo tanto, casi todas las reglas comerciales estarán en el modelo.
Encuentro una pregunta útil que me pregunto cuándo tengo que decidir dónde poner algo de lógica: "¿Es esto cierto o solo para la parte de la aplicación que estoy codificando actualmente?"
La forma en que tengo mi estructura de aplicación ASP.NET MVC, el flujo de trabajo se ve así:
Controlador -> Servicios -> Repositorios
La capa de servicios anterior es donde tiene lugar toda la lógica de negocios. Si coloca su lógica de negocios en su capa de Controlador, perderá la capacidad de reutilizar esa lógica comercial en otros controladores.
No creo que pertenezca al controlador, porque una vez que está integrado no puede salir.
Creo que MVC debería tener otra capa inyectada en el medio: una capa de servicio que se asigna a los casos de uso. Contiene lógica de negocios, sabe sobre unidades de trabajo y transacciones, y trata con objetos modelo y de persistencia para llevar a cabo sus tareas.
El controlador tiene una referencia al servicio que necesita para cumplir con su caso de uso. Se preocupa por desasignar solicitudes en objetos con los que el servicio puede ocuparse, llama al servicio y ordena la respuesta para enviar de vuelta a la vista.
Con esta disposición, el servicio se puede usar solo incluso sin el par controlador / vista. Puede ser un objeto local o remoto, empaquetado e implementado de la forma que desee, que el controlador maneje.
El controlador ahora se vincula más estrechamente a la vista. Después de todo, es probable que el controlador que usará para un escritorio sea diferente al de una aplicación web.
Creo que este diseño está más orientado al servicio.
Ponga su lógica de negocio en el dominio y mantenga su dominio por separado. Preferí Presenter -> Command (Comando de mensaje use NServiceBus) -> Dominio (con BC Bounded Context) -> EventStore -> Manejador de eventos -> Repository (modelo de lectura). Si la lógica no encaja en el dominio, utiliza la capa de servicio.
Lea el artículo de Martin Fowler, Eric Evan, Greg Young y Udi dahan. Han definido una imagen muy clara.
Aquí está el artículo escrito por Mark Nijhof: http://elegantcode.com/2009/11/11/cqrs-la-greg-young/
Puedes ponerlo en dos lugares. El controlador y en la capa de presentación. Al tener algo de la lógica en la capa de Presentación, puede limitar el número de solicitudes a la arquitectura que agrega carga al sistema. Sí, tienes que codificar dos veces, pero a veces esto es lo que necesitas para una experiencia de usuario receptiva.
Me gusta un poco lo que se dijo aquí ( http://www.martinhunter.co.nz/articles/MVPC.pdf )
"Con MVPC, el componente presentador del modelo MVP se divide en dos componentes: el presentador (ver lógica de control) y el controlador (lógica de control de propósito abstracto)".