none
Buenas Practicas con el Modelo MVC 4 y EF 6 VS2012 RRS feed

  • Pregunta

  • Encontre que el Modelo de MVC 4 son de 3 tipos:

    Definiciones:

    Desde el punto de vista del patron MVC, los Modelos son objetos que cumplen alguna funcionalidad. El framework ASP.NET MVC 4
       propone tres tipos de clases modelos: Modelo de Datos, Modelo de Negocio y Modelo de Vista.

       Modelo de Datos (Data Model): Los objetos de una clase modelo representan clases que están interactuando con la Base de Datos.
       Esta clases se puede crear por medio de la herramienta Entity Framework (EF), existen dos forma de generar estas clases:
       database-first-approach (se crea primero la base de datos y después se generan las clases) y code-first-approach (se crean primero la clases
        y después la base de datos)

       Modelo de Negocio (Business Model): Esta clases normalmente representan o implementan reglas del negocio o algún proceso (por ejemplo calcular
       el total de una compra, a través de un carrito de compra). Por lo general estas clases interactuan con los Modelos de Datos.

       Modelo de Vista (View Model): Esta clases proveen información del Controlador a la Vista, por ejemplo una clase vista puede consultar
       la información de un producto que va a ser utilizado en la vista como es el precio, una imagen o el nombre. La función de estas clases no
       esta en el procesamiento de información, solo se encarga de organizar la información para que sea presentado al usuario por medio de la vista.

    Mis duda son las siguientes:

    1. Para un Modelo de Datos cuando Adiciono un ADO.NET Entity Data Model (*.edmx) Database First en la carpeta Model, con el nombre MyModel.edmx tengo los 4 elementos: MyModel.Context.tt, MyModel.Designer.cs, MyModel.edmx.diagram, MyModel.tt ¿Es una buena practica colocar el ADO.NET Entity Data Model (*.edmx) en la carpeta del modelo o habria que crearlo en otra carpeta o capa (proyecto)? ¿Es una buena practica dejar las clases POCO de MyModel.tt en la carpeta Model?
    2. Como crearia el Modelo de la Vista si ya tengo clases POCO generadas por el ADO.NET Entity Data Model (*.edmx) se crearian en las mismas clases POCO o crearia otra clase? ver detalle 1
    3. Como aplico el Modelo de Negocio en las clases POCO por ejemplo: User, se puede aplicar en una clase POCO o habria que crear una clase nueva

    detalle 1:

    En mi clase POCO User tengo lo siguiente:

    //------------------------------------------------------------------------------
    // <auto-generated>
    //    Este código se generó a partir de una plantilla.
    //
    //    Los cambios manuales en este archivo pueden causar un comportamiento inesperado de la aplicación.
    //    Los cambios manuales en este archivo se sobrescribirán si se regenera el código.
    // </auto-generated>
    //------------------------------------------------------------------------------
    
    namespace Prueba.Models
    {
        using System;
        using System.Collections.Generic;
        
        public partial class User
        {
            public string NombreUsuario { get; set; }
            public string Nombres { get; set; }
            public string ApellidoPaterno { get; set; }
            public string ApellidoMaterno { get; set; }
            public string CorreoElectronico { get; set; }
            public string Contraseña { get; set; }
            public short TipoUsuario { get; set; }
        }
    }

    Ahora para el registro de usuario en la Vista necesito tener este tipo de clase (hay un atributo extra ConfirmarContraseña):

    public class RegisterUserModel
        {
            [Required(ErrorMessage = "El Nombre de Usuario es obligatorio...")] //Colocamos este atributo para que el nombre de usuario sea obligatorio
            [Display(Name = "Nombre de Usuario")]   //Colocamos el nombre, que se usara en un label
            public string NombreUsuario { get; set; }
    
            [Required(ErrorMessage = "Los Nombres son obligatorios...")]    //Colocamos este atributo para que los nombres sean obligatorios
            [Display(Name = "Nombres")] //Colocamos el nombre, que se usara en un label
            public string Nombres { get; set; }
    
            [Required(ErrorMessage = "El Apellido Paterno es obligatorio...")]  //Colocamos este atributo para que el apellido paterno sea obligatorio
            [Display(Name = "Apellido Paterno")]    //Colocamos el nombre, que se usara en un label
            public string ApellidoPaterno { get; set; }
    
            [Display(Name = "Apellido Materno")]    //Colocamos el nombre, que se usara en un label
            public string ApellidoMaterno { get; set; }
    
            [Required(ErrorMessage = "El Correo Electronico es obligatorio...")]    //Colocamos este atributo para que el correo electronico sea obligatorio
            [Display(Name = "Correo Electronico")]  //Colocamos el nombre, que se usara en un label
            [RegularExpression(@"^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", ErrorMessage = "El correo electronico no es correcto...")] //Expresion regular que valida un email
            public string CorreoElectronico { get; set; }
    
            [Required(ErrorMessage = "La Contraseña es obligatoria...")]    //Colocamos este atributo para que la contraseña sea obligatorio
            [Display(Name = "Contraseña")]  //Colocamos el nombre, que se usara en un label
            public string Contraseña { get; set; }
    
            [Display(Name = "Confirmar Contraseña")]    //Colocamos el nombre, que se usara en un label
            [Compare("Contraseña", ErrorMessage = "Las contraseñas no coinciden...")]   //Compara una propiedad con la actual, tienen que tener los mismos datos
            public string ConfirmarContraseña { get; set; }
    
            [Required(ErrorMessage = "El Tipo de Usuario es obligatorio...")]   //Colocamos este atributo para que el tipo de usuario sea obligatorio
            [Display(Name = "Tipo de Usuario")] //Colocamos el nombre, que se usara en un label
            public int TipoUsuario { get; set; }
        }

    Como menciona la pregunta 2 donde colocaria esta clase, dentro de la clase POCO User, teniendo el archivo 2 clases o la separaria en otra clase en un archivo independiente?

    Gracias por su tiempo.




    • Editado RealMaster martes, 6 de enero de 2015 2:16
    martes, 6 de enero de 2015 2:08

Todas las respuestas

  • hola

    >>¿Es una buena practica colocar el ADO.NET Entity Data Model (*.edmx) en la carpeta del modelo o habria que crearlo en otra carpeta o capa (proyecto)? ¿Es una buena practica dejar las clases POCO de MyModel.tt en la carpeta Model?

    como en todo la respuesta es depende

    si la aplicacion es simple y centrada en los datos, no veo el problema de conectar directo el modelo de la view con el modelo que define EF

    ahora si tu aplciaicon requiere reglas de negocio, workflows, validaciones complejas, etc en ese caso no tomes ese camino, programa en capas separando el modelo de la view del modelo de persistencia

    para esto vas a tener que llevar el modelo de EF a un proyecto separado, es mas recomendaria que implemente EF Code First y no uses el edmx

    si quieres implementa el patron repository, o si te animas alguna aotra arquitectura como ser CQRS, que tambien esta de moda, pero no uses el mismo modelo

    >>Como crearia el Modelo de la Vista si ya tengo clases POCO generadas por el ADO.NET Entity Data Model (*.edmx) se crearian en las mismas clases POCO o crearia otra clase?

    es que cada clase estaria en proyectos separados la clase poco que genera EF la tendrias en un proyecto de Class Library y la clase de la view en la carpeta Models del mvc genera

    >>Como aplico el Modelo de Negocio en las clases POCO por ejemplo: User, se puede aplicar en una clase POCO o habria que crear una clase nueva

    si usas un edmx va a ser un poco complicado de extender las clases que se generan en base al modelo del edmx, quizas creando una clase partial

    seria mejor aplicas Code First ya que tendrias la clase definida para poder extender

    si defines logica de negocio en una clase deja de ser POCO, sino que tiendes mas a una arquitectura de DDD (Domain Driven Design)

    aunque quizas si defines una aplicacion en 3 capas seria mas simple de implementar, en la capa de negocio defiens la logica y validaciones

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 6 de enero de 2015 2:44
  • Muchas Gracias Leandro, ando un poco liado con este tema, pero ya estoy comprendiendo.

    >>¿Es una buena practica colocar el ADO.NET Entity Data Model (*.edmx) en la carpeta del modelo o habria que crearlo en otra carpeta o capa (proyecto)? ¿Es una buena practica dejar las clases POCO de MyModel.tt en la carpeta Model?

    como en todo la respuesta es depende

    si la aplicacion es simple y centrada en los datos, no veo el problema de conectar directo el modelo de la view con el modelo que define EF

    ahora si tu aplciaicon requiere reglas de negocio, workflows, validaciones complejas, etc en ese caso no tomes ese camino, programa en capas separando el modelo de la view del modelo de persistencia

    para esto vas a tener que llevar el modelo de EF a un proyecto separado, es mas recomendaria que implemente EF Code First y no uses el edmx

    si quieres implementa el patron repository, o si te animas alguna aotra arquitectura como ser CQRS, que tambien esta de moda, pero no uses el mismo modelo

    Entonces:

    1.- Si la aplicacion es simple y centrada en los datos se debe colocar en la carpeta Model de MVC el Modelo de Datos en este caso un ADO.NET Entity Data Model (*.edmx), junto con las clases del Modelo de Vista

    2.- Si la aplicacion es mediana a grande, la arquitectura tendria que ser en capas: 1 capa para el Modelo de Datos y otra capa para el MVC, donde las clases del Modelo de Vista se encuentran en la carpeta Model

    Pregunta 1: Porque usar Code First en vez de Database First o Model First cuando separo en otra capa el Modelo de Datos?

    >>Como crearia el Modelo de la Vista si ya tengo clases POCO generadas por el ADO.NET Entity Data Model (*.edmx) se crearian en las mismas clases POCO o crearia otra clase?

    es que cada clase estaria en proyectos separados la clase poco que genera EF la tendrias en un proyecto de Class Library y la clase de la view en la carpeta Models del mvc genera

    Pregunta 2: Se deberia separa las clases POCO en otra capa, me refiero al elemento MyModel.tt o habria que dejarlo junto con el ADO.NET Entity Data Model (*.edmx) en una sola capa, que beneficios me daria?

    >>Como aplico el Modelo de Negocio en las clases POCO por ejemplo: User, se puede aplicar en una clase POCO o habria que crear una clase nueva

    si usas un edmx va a ser un poco complicado de extender las clases que se generan en base al modelo del edmx, quizas creando una clase partial

    seria mejor aplicas Code First ya que tendrias la clase definida para poder extender

    si defines logica de negocio en una clase deja de ser POCO, sino que tiendes mas a una arquitectura de DDD (Domain Driven Design)

    aunque quizas si defines una aplicacion en 3 capas seria mas simple de implementar, en la capa de negocio defiens la logica y validaciones

    3.- Entonces deberia tener 3 capas: 1 capa para el Modelo de Negocio, 1 capa para el Modelo de Datos y 1 capa para el MVC, donde las clases del Modelo de Vista se encuentran en la carpeta Model

    Pregunta 3: Mencionas que en la capa para el Modelo de Negocio defina la logica y validaciones, eso no lo hace ya en la capa del Modelo de Datos con Data annotations sobre las propiedades de cada entidad

    Pregunta 4: Todas las capas adicionales que se creen va a tener que manejarse desde la carpeta Controller del MVC

    Saludos

    martes, 6 de enero de 2015 23:26