none
Models - implementar modelos en el patrón de diseño MVC RRS feed

  • Pregunta

  • Hola

    Estoy trabajando con ASP.NET MVC, Visual Studio 2015, Entity Framework

    MVC: Es un patrón de diseño que va implementado en la capa de presentación. Muy distinto a un patrón de arquitectura.

    Partiendo de la premisa de la definición de MVC, en mi caso he decidido implementar los Models en otra capa por decisión propia. MVC no me obliga a que implemente los models(ViewModel en la carpetita Models).

    Según los puristas de arquitectura dicen que las entidades del dominio solo conviven en el dominio, que jamas deben de llegar a la capa de presentación.

    En mi caso trabajo en un proyecto N Capas en el cual tengo implementado los Dtos en la capa de Aplicación, cuando armo mis vistas los hago con mis clases Dtos que vienen a representar mis models, al trabajar de esta manera ya no me hacen falta los ViewModels. Por que en mi arquitectura los model se toman de otra capa.

    ¿Algún purista en arquitectura me podría decir si tendría problemas en un desarrollo real trabajando de esta manera el patrón de diseño MVC, teniendo los models en otra capa? he hecho pruebas hasta el momento no he tenido problemas.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 10 de marzo de 2017 0:00

Respuestas

  • No hay ningun problema desde el punto de vista de la compilacion y ejecucion del codigo. Al fin y al cabo, el Model no es mas que una clase que contiene datos, y la clase puede estar declarada en cualquier sitio, da igual la capa que sea.

    Dicho eso, en una aplicacion realista un poco complicada, te interesara distinguir dos clases de modelo: por una parte, esta el Modelo de entidades de negocio utilizadas en tu aplicacion, que guarda los datos tal como los requiera el dominio de la aplicacion, y por otro tienes el Modelo de presentacion de datos, que es la M de MVC. Para no confundirlo con el otro, a veces a este ultimo se le llama VistaModelo. En aplicaciones muy sencillas, puede que los dos modelos coincidan. Pero en cuanto que tengas que hacer alguna pantalla un poco sofisticada, es muy normal que los datos que tengas que presntar en la pantalla sean el resultado de calculos u otras operaciones realizadas sobre los datos de negocio. En este caso, el resultado de dichas operaciones se debe meter en un VistaModelo, que en general no coincidira con el Modelo o Modelos que contenian los datos de negocio usados como punto de partida. Los puristas te diran que esto se debe hacer siempre en todos los casos, incluso aunque se de la coincidencia de que el modelo y el vistamodelo contengan la misma informacion, porque al evolucionar el programa podrian cambiar los datos del dominio y/o de la presntacion, y al tener los dos modelos desacoplados se pueden hacer esos cambios de manera "aislada" en cada capa.

    • Marcado como respuesta Pedro Ávila viernes, 10 de marzo de 2017 19:24
    viernes, 10 de marzo de 2017 8:37
  • hola

    >>En mi caso trabajo en un proyecto N Capas en el cual tengo implementado los Dtos en la capa de Aplicación

    como se comunica el controller con esta capa de aplicacion ? lo realizas por medio de algun servicio web o webapi, etc

    porque sino es ais no veo porque le has puesto Dto a las entidades

    imagino conoces que Dto = Data Transfer Object, por lo tanto sino hay una transferencia por algun medio entonces no hay dto

    si la comunicacion entre MVC y la capa de aplicacion es simplemente inyectando o instanciando entonces solo defines clases de model o viewmodel, no de Dto, es simplemente un tema de nombre

    >>Por que en mi arquitectura los model se toman de otra capa.

    tener un proyecto donde defines entidades con propiedades no es uan capa, es solo un proyecto que usas para separar el lugar donde defines estas clases, pero no cuenta como capa

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Pedro Ávila viernes, 10 de marzo de 2017 19:24
    viernes, 10 de marzo de 2017 13:01

Todas las respuestas

  • No hay ningun problema desde el punto de vista de la compilacion y ejecucion del codigo. Al fin y al cabo, el Model no es mas que una clase que contiene datos, y la clase puede estar declarada en cualquier sitio, da igual la capa que sea.

    Dicho eso, en una aplicacion realista un poco complicada, te interesara distinguir dos clases de modelo: por una parte, esta el Modelo de entidades de negocio utilizadas en tu aplicacion, que guarda los datos tal como los requiera el dominio de la aplicacion, y por otro tienes el Modelo de presentacion de datos, que es la M de MVC. Para no confundirlo con el otro, a veces a este ultimo se le llama VistaModelo. En aplicaciones muy sencillas, puede que los dos modelos coincidan. Pero en cuanto que tengas que hacer alguna pantalla un poco sofisticada, es muy normal que los datos que tengas que presntar en la pantalla sean el resultado de calculos u otras operaciones realizadas sobre los datos de negocio. En este caso, el resultado de dichas operaciones se debe meter en un VistaModelo, que en general no coincidira con el Modelo o Modelos que contenian los datos de negocio usados como punto de partida. Los puristas te diran que esto se debe hacer siempre en todos los casos, incluso aunque se de la coincidencia de que el modelo y el vistamodelo contengan la misma informacion, porque al evolucionar el programa podrian cambiar los datos del dominio y/o de la presntacion, y al tener los dos modelos desacoplados se pueden hacer esos cambios de manera "aislada" en cada capa.

    • Marcado como respuesta Pedro Ávila viernes, 10 de marzo de 2017 19:24
    viernes, 10 de marzo de 2017 8:37
  • hola

    >>En mi caso trabajo en un proyecto N Capas en el cual tengo implementado los Dtos en la capa de Aplicación

    como se comunica el controller con esta capa de aplicacion ? lo realizas por medio de algun servicio web o webapi, etc

    porque sino es ais no veo porque le has puesto Dto a las entidades

    imagino conoces que Dto = Data Transfer Object, por lo tanto sino hay una transferencia por algun medio entonces no hay dto

    si la comunicacion entre MVC y la capa de aplicacion es simplemente inyectando o instanciando entonces solo defines clases de model o viewmodel, no de Dto, es simplemente un tema de nombre

    >>Por que en mi arquitectura los model se toman de otra capa.

    tener un proyecto donde defines entidades con propiedades no es uan capa, es solo un proyecto que usas para separar el lugar donde defines estas clases, pero no cuenta como capa

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Pedro Ávila viernes, 10 de marzo de 2017 19:24
    viernes, 10 de marzo de 2017 13:01
  • @Leandro

    como se comunica el controller con esta capa de aplicacion ? lo realizas por medio de algun servicio web o webapi, etc

    Presentación esta desacoplada con la capa de Aplicación utilizo IoC Ninject 

    porque sino es ais no veo porque le has puesto Dto a las entidades

    imagino conoces que Dto = Data Transfer Object, por lo tanto sino hay una transferencia por algun medio entonces no hay dto.

    Utiizando Dtos evito que las entidades de dominio llegen a Presentación, En la capa de Aplicación utilizo Automapper para convertir Dtos a Entidades del Dominio y viceversa. ¿De que otra manera puedes evitar que las entidades de negocio lleguen a presentación?

    Con los Dtos trasnfiero datos de Presentación los tomo de las vistas y lo envio a las Entidades de Negocio aplicando automapper y viceversa cuando los tenga que mostrar en las vistas. 

    si la comunicacion entre MVC y la capa de aplicacion es simplemente inyectando o instanciando entonces solo defines clases de model o viewmodel, no de Dto, es simplemente un tema de nombre

    En mi caso es inyectado, entonces me quieres decir que utilice la carpeta M(Models), si es así las entidades de dominio llegarían a la capa de Presentación y el automapper lo aplicaría en Presentación(aplicar automapper en presentación no me cuadra cuando esa conversión de entidades se puede hacer antes de llegar a Presentación)

    tener un proyecto donde defines entidades con propiedades no es uan capa, es solo un proyecto que usas para separar el lugar donde defines estas clases, pero no cuenta como capa

    En la capa de aplicación tengo una carpeta de Dtos donde van las clases dtos.

    Arquitectura de mi aplicación


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 10 de marzo de 2017 13:46
  • hola

    >>Presentación esta desacoplada con la capa de Aplicación utilizo IoC Ninject

    entonces no tienes dto, son simplementes clases de model o viewmodel

    >>Utiizando Dtos evito que las entidades de dominio llegen a Presentación, En la capa de Aplicación utilizo Automapper para convertir Dtos a Entidades del Dominio y viceversa.

    si eso se entiende, pero si usas los dto como model de la view entonces no son dto

    es un tema conceptual, ambos son son clase con propiedades, pero dto se usa cuando hay un protocolo en medio como ser http, etc

    si solo instancias (o inyectas) eso no es dto

    ademas tiene que ver si a estas clases le aplicas DataAnnotations para definir validaciones, si lo haces entonces son models

    >>si es así las entidades de dominio llegarían a la capa de Presentación y el automapper lo aplicaría en Presentación

    claro, la presentacion convierte las entidade de domino en entidades de vista, esto se puede realizar en el controller

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 10 de marzo de 2017 17:20
  • @Leandro

    Si uso DataAnotation lo mas minimo, lo que uso para validar es FluentValidation.

    Me recomiendas algún manual para implementar ViewModel o Model, oh solo es una clase con propiedades.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 10 de marzo de 2017 19:23
  • >>Me recomiendas algún manual para implementar ViewModel o Model, oh solo es una clase con propiedades.

    es una clase con propiedades, es mas es igual a los Dto que mencionas, solo que conceptualmente como los usas no son dto

    si entre la presentacion y el servidor usarias por ejemplo web api, en ese caso si tendrias dto

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 10 de marzo de 2017 19:29