none
arquitectura en MVC RRS feed

  • Pregunta

  • Buenas tardes, 

    Tengo una duda a ver si me la podeis solcionar, estoy realizando una aplicacicon en MVC, el problema es que la arquitectura que he elegido es en n-capas, (puede gustar o no me da igual, es en donde yo me siento mas comodo), entonces paso a detallarla como la he creado y cual es mi duda.

    Detalle de la arquitectura 

    Capa Presentacion: Dentro de esta capa tengo los javascript, los controllers, y las vistas.

    Capa Negocio y Entidades : Aqui tengo dos proyectos :

    • Proyecto Uno : Entidades, donde reflejo las propiedades del E.F. y metodos de guardar, editar, consultar, etc.
    • Proyecto Dos : Negocio, aquí lo que tengo es una llamada a las clases de entidades y en donde se realizan las llamadas a los metodos de cada clase de entidades para guardar, consultar, etc.  Cada clase de este proyecto es la que utilizo en las vistas para relacionarlas. (la utilizo como Modelo). 

    Capa Datos : Capa de Persistencia.

    Pongo un ejemplo tengo una vista llamada V, dentro de esa vista hago una llamda a la clase de la capa de Negocio C, y esa clase hace referencia a dos clases de Entidades  A y B, 

    Dentro de la vista hago la siguiente referencia 

    @model Bussiness.C, 

    dentro de la vista llamaria C.A.Id ? 

    Esta bien usar la arquitectura asi? o que me recomendais, es que cuando hago validaciones dentro del controlador las clases de entidades no me vienen creadas, debere hacer un new dentro del get?

    Gracias

    lunes, 10 de noviembre de 2014 11:10

Respuestas

  • Si deseas respetar los principios de diseño de MVC, lo único que debería hacerse en la Vista es presentar los datos que el Controlador haya previamente cargado dentro del Modelo. No debería haber en la vista ninguna llamada a las clases de negocio. Esas llamadas siempre las tiene que hacer el controlador, y una vez que el controlador ya haya recuperado la información necesaria, la almacena dentro de una clase que se llama Modelo, y le pasa ese Modelo a la Vista. La vista no debe contener nada de código ejecutable, sólo lo imprescindible para visualizar la información que el controlador metió dentro de el Modelo.

    En cuanto a que dentro del controlador las clases de entidades no vienen creadas: Haciendo las cosas bien hechas, siempre van a venir creadas. Cuando llames a la capa de negocio para que te suministre datos, en algún momento esa capa creará las entidades y se las devolverá "rellenas" al controlador. El controlador copiará esas entidades a las que se usan como modelo (en casos triviales pueden usarse las mismas entidades como modelo pero en las pantallas complejas serán clases específicamente creadas para este fin). Y cuando la Vista devuelva datos al controlador con un Post, en los casos triviales podrás declarar la entidad (o la clase del modelo cuando proceda) como argumento del metodo de acción, y el Default Binder la instanciará y relenará automáticamente, por lo que también en este caso te llegará ya creada al Controlador.

    lunes, 10 de noviembre de 2014 11:25
  • >>Esta bien usar la arquitectura asi?

    me temo que no, como lo planteas pareciera que desarrollas en asp.net deberias hacer

    public class XXController : Controller {

        public ActionResult Index(){

                Bussiness obj = new Bussiness();

                Bussiness.C  model = obj.MetodoXX();

                return View(model)

        }

    }

    podrias usar en la view las entidades que defines en otro proyecto peor me parece muy raro que sea Bussiness.C

    aunque me suena raro que una entidad esta bajo un namespace Bussiness ? eso no esta bueno, confunde un poco ya que pareciera que entidades y logica esta todo junto

    como veras la idea es que la capa de negocio sea llamada desde el action en el controlador, no desde la view

    la view solo recibe los datos de la entidad que define como modelo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 10 de noviembre de 2014 12:20
  • >>dentro de la carpeta Model, crearia las clases que llamarian al proyecto de Entidades no?

    si creas una clase en la carpeta model esta no invoca a nadie, solo sirve como modelo de la view, nada mas

    es el action del controller quien invoca a tu logica de negocio para tomar los datos y enviarlos a la view

    por supuesto es el action quien convierte los datos de la entidad de negocio a la entidad del modelo, si fuera necesario

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 10 de noviembre de 2014 16:24

Todas las respuestas

  • Si deseas respetar los principios de diseño de MVC, lo único que debería hacerse en la Vista es presentar los datos que el Controlador haya previamente cargado dentro del Modelo. No debería haber en la vista ninguna llamada a las clases de negocio. Esas llamadas siempre las tiene que hacer el controlador, y una vez que el controlador ya haya recuperado la información necesaria, la almacena dentro de una clase que se llama Modelo, y le pasa ese Modelo a la Vista. La vista no debe contener nada de código ejecutable, sólo lo imprescindible para visualizar la información que el controlador metió dentro de el Modelo.

    En cuanto a que dentro del controlador las clases de entidades no vienen creadas: Haciendo las cosas bien hechas, siempre van a venir creadas. Cuando llames a la capa de negocio para que te suministre datos, en algún momento esa capa creará las entidades y se las devolverá "rellenas" al controlador. El controlador copiará esas entidades a las que se usan como modelo (en casos triviales pueden usarse las mismas entidades como modelo pero en las pantallas complejas serán clases específicamente creadas para este fin). Y cuando la Vista devuelva datos al controlador con un Post, en los casos triviales podrás declarar la entidad (o la clase del modelo cuando proceda) como argumento del metodo de acción, y el Default Binder la instanciará y relenará automáticamente, por lo que también en este caso te llegará ya creada al Controlador.

    lunes, 10 de noviembre de 2014 11:25
  • >>Esta bien usar la arquitectura asi?

    me temo que no, como lo planteas pareciera que desarrollas en asp.net deberias hacer

    public class XXController : Controller {

        public ActionResult Index(){

                Bussiness obj = new Bussiness();

                Bussiness.C  model = obj.MetodoXX();

                return View(model)

        }

    }

    podrias usar en la view las entidades que defines en otro proyecto peor me parece muy raro que sea Bussiness.C

    aunque me suena raro que una entidad esta bajo un namespace Bussiness ? eso no esta bueno, confunde un poco ya que pareciera que entidades y logica esta todo junto

    como veras la idea es que la capa de negocio sea llamada desde el action en el controlador, no desde la view

    la view solo recibe los datos de la entidad que define como modelo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 10 de noviembre de 2014 12:20
  • Hola Leandro, Gracias por responder, ok es que vengo de asp.net, 

    Entonces si me quedo claro dentro de la carpeta Model, crearia las clases que llamarian al proyecto de Entidades no?, dentro de los controladores haria las llamadas a las clases del Modelo. no?

    lunes, 10 de noviembre de 2014 16:16
  • >>dentro de la carpeta Model, crearia las clases que llamarian al proyecto de Entidades no?

    si creas una clase en la carpeta model esta no invoca a nadie, solo sirve como modelo de la view, nada mas

    es el action del controller quien invoca a tu logica de negocio para tomar los datos y enviarlos a la view

    por supuesto es el action quien convierte los datos de la entidad de negocio a la entidad del modelo, si fuera necesario

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 10 de noviembre de 2014 16:24