none
Desacoplar Capa de Datos(EF) de Capa Presentacion(MVC) RRS feed

  • Pregunta

  • Espero puedan ayudarme con un problema que no se como solucionarlo.

    Estoy realizando un proyecto en 4 capas usando EF(database first) en la capa de Datos y MVC en la presentación

    Las capas son la siguientes

    Entities(aquí tengo las clase poco .tt generadas por EF)
    DataAcces(Tengo el modelo EF con la clase DBCONTEXT)
    BussinesLayer(Esta capa la usare para hacer algunas validaciones)
    Presentation(usando mvc)

    El problema que tengo es en mi capa web en donde uso mvc al momento de agregar un controlador o una vista no me aparece el Data Context Class(no puedo agregar controlador ni vista)

    Creería que es porque el Data context se encuentra en la capa de datos donde tengo mi modelo y como en mi capa Web solo agrego como referencia mi capa de negocios y Entities(que creo que es lo correcto).

    La duda es, Entonces es necesario que en mi capa web agregue como referencia mi capa de datos(al agregar como referencia si me aparece el Data Context) o como soluciono este problema?

    Este modelo lo he implementado con windows forms y me funciona pero en MVC no logro hacerlo


    domingo, 30 de junio de 2019 16:11

Respuestas

  • Entonces es correcto hacer referencia desde mi capa web a la capa de datos? 

    Lo digo porque no me parece normal hacer eso, como lo mencione ya he trabajado con EF en Winnform siempre esta misma estructura 4 capas y en la capa presentacion no  tuve que hacer referencia a mi capa de datos, y como en MVC soy nuevo no se si esta correcto de esta manera

    domingo, 30 de junio de 2019 18:26
  • hola

    >>Las capas son la siguientes Entities(aquí tengo las clase poco .tt generadas por EF)

    Las entities no son una capa, por o que solo usas 3 capas, no 4

    >>El problema que tengo es en mi capa web en donde uso mvc al momento de agregar un controlador o una vista no me aparece el Data Context Class

    no lo uses, no es buena idea, creas clases en la carpeta Model y crea los controles en base a estos, despues conviertes eso model de mvc en as entidades de EF necesite

    >>Entonces es necesario que en mi capa web agregue como referencia mi capa de datos

    No si vas a repetar la separacion en capas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 30 de junio de 2019 18:51
  • Como podría convertir el model de mvc a las entidades de EF

    Yo he tratado de hacerlo de la siguiente manera

    EF me ha creado una clase entidad de la siguiente manera

        public partial class Categoria
        {
            
            public Categoria()
            {
                this.Articulo = new HashSet<Articulo>();
            }
        
            public int CatId { get; set; }
            public string CatNombre { get; set; }
        
            
            public virtual ICollection<Articulo> Articulo { get; set; }
        }

    yo he pensado crear en la capa Entities una clase Modelo de la siguiente manera

        public  class ModeloCategoria
        {
            public int CatId { get; set; }
            public string CatNombre { get; set; }
        }
    }

    Y en mi capa datos hago lo siguiente para listar mis categorias

     public class CategoriaDAL
        {
            public  List<ModeloCategoria> ListarCategorias()
            {
                using (ProductosEntities bd = new ProductosEntities())
                {
                    return bd.Categoria.Select(MapearAplicacion).ToList();
    
                }
            }
    
    
            //metodo para covertir modelo a clase ef
            private ModeloCategoria MapearAplicacion(Categoria cat)
            {
                return new ModeloCategoria()
                {
                    CatId = cat.CatId,
                    CatNombre = cat.CatNombre
                };
            }
    
            private Categoria MapearBD(ModeloCategoria modelo)
            {
                return new Categoria()
                {
                    CatId = modelo.CatId,
                    CatNombre = modelo.CatNombre
                };
            }
        }


    en mi capa de negocios hago lo siguiente

     public class CategoriaBL
        {
    
            public static List<ModeloCategoria> ListarCategorias()
            {
                CategoriaDAL cat = new CategoriaDAL();
                return cat.ListarCategorias();
            }
    
    
    
            private static Categoria MapearBD(ModeloCategoria modelo)
            {
                return new Categoria()
                {
                    CatId = modelo.CatId,
                    CatNombre = modelo.CatNombre
                };
            }
    
            private static ModeloCategoria MapearAplicacion(Categoria cat)
            {
                return new ModeloCategoria()
                {
                    CatId = cat.CatId,
                    CatNombre = cat.CatNombre
                };
            }
    
        }

    Pero me surge la duda que los metodos para convertir el modelo a las clases entidades lo tengo que implementar en la capa de negocios y en la capa de datos(no se si sea la mejor opcion)

    Por ultimo en mi controlador tengo lo siguiente

            public ActionResult Index()
            {
                var cat = CategoriaBL.ListarCategorias();
                return View(cat);
            }

    No se si esta sea la manera correcta de hacerlo.

    o me podrias indicar Leandro como hacerlo en la Carpeta Models tal como tu lo indicas

    domingo, 30 de junio de 2019 22:18
  • hola

    >>Pero me surge la duda que los metodos para convertir el modelo a las clases entidades lo tengo que implementar en la capa de negocios y en la capa de datos

    porque dos veces, llava esa funcionalidad a uan tercer clase de mapping y listo

    public static class CategoriaMapper{
    
    
    	private static Categoria MapearBD(ModeloCategoria modelo)
    	{
    		return new Categoria()
    		{
    			CatId = modelo.CatId,
    			CatNombre = modelo.CatNombre
    		};
    	}
    
    	private static ModeloCategoria MapearAplicacion(Categoria cat)
    	{
    		return new ModeloCategoria()
    		{
    			CatId = cat.CatId,
    			CatNombre = cat.CatNombre
    		};
    	}
    
    }

    Pero la conversion solo la aplicas en el controller para pasarla al BL, despues hacia atras continuas usando la clase del negocio

    la class del model de mvc solo se usa en la capa de presentacion, hacia la BL y demas se usa la clase de dominio

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 1 de julio de 2019 1:43
  • Desde mi punto de vista, es diferente a como lo ves.

    Veo que estas entendiendo como capa a una dll o componente y yo no lo veo asi.

    Una capa se puede componer de N componentes o dlls. Por ejemplo en las arquitecturas que yo manejo que logre después de varios proyectos en diferentes empresas y varios manuales que he leido. Mi capa de Negocio o de Dominio se compone de los siguientes Componentes o dlls.

    Capa Negocio o Domino

    1.- Dll EntitiesPoco = EL mapeo de las tablas de tu base de datos en clases EF.

    2.- Dll Entities = Todos los objetos que realizan logica. Muchas veces como desarrolladores metemos logica en los datos desde mi humilde opinión esta mal. Ejemplo una clase factura requiere un folio. Muchos implementan la lógica del folio en la clase factura pero una factura no se pone el folio sola. Si nos basamos en el mundo real existe el objeto foleador que recibe facturas y les asigna el folio. Por eso creo la Dll entities que tiene esa clase de objetos de negocio.

    3.- Dll de Interfaces de Datos = Esta dll contiene las interfaces para los repositorios de la capa de datos que quiere decir interfaces con las operaciones CRUD.

    4.- Dll ServiceManager = esta dll contiene los servicios del negocio que quiere decir que tendra clases de servico que retornaran las listas List<T> hacia los servicios Web o Presentacion. Esta dll es la expone tu logica y tus objetos en modo de listas.

    Con estos cuatro Dlls tu tienes control total de tu logica de negocio.

    Ahora las EntitiesPoco viajan por toda la aplicacion Y la Dll de ServiceManager es usada por tu servicio o por tu Presentacion.

    EntitiesPoco si tiene un Using en tu MVC por que es la informacion que viaja

    Estas son retornadas por tu service Manager osea tu controlador tiene un using a ServiceManager y a EntitiesPoco

    Y allí si tienes definido un modelo de vista haces el mapeo a to Modelo que es parte de tu presentación.

    Imagina que estas en tu controller Cliente. y tienes tu Modelo Cliente.

    Bueno tu controlles Cliente hara esto

    ServiceManager service = new ServiceManager();
    
    ModeloCliente cliente = (from item in service.BuscarCliente(id)
    Select New cliente()
    {
        id = item.Id,
        Nombre = item.Nombre
    }).FirstOrDefault();

    y asi estarias obteniendo y mapeando tus entidadesPoco con tu modelo de datos

    lunes, 1 de julio de 2019 16:41

Todas las respuestas

  • Pues si tus controllers van a usar a tu dbcontext pues si tienen que tener una referencia.

    domingo, 30 de junio de 2019 17:56
  • Entonces es correcto hacer referencia desde mi capa web a la capa de datos? 

    Lo digo porque no me parece normal hacer eso, como lo mencione ya he trabajado con EF en Winnform siempre esta misma estructura 4 capas y en la capa presentacion no  tuve que hacer referencia a mi capa de datos, y como en MVC soy nuevo no se si esta correcto de esta manera

    domingo, 30 de junio de 2019 18:26
  • hola

    >>Las capas son la siguientes Entities(aquí tengo las clase poco .tt generadas por EF)

    Las entities no son una capa, por o que solo usas 3 capas, no 4

    >>El problema que tengo es en mi capa web en donde uso mvc al momento de agregar un controlador o una vista no me aparece el Data Context Class

    no lo uses, no es buena idea, creas clases en la carpeta Model y crea los controles en base a estos, despues conviertes eso model de mvc en as entidades de EF necesite

    >>Entonces es necesario que en mi capa web agregue como referencia mi capa de datos

    No si vas a repetar la separacion en capas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 30 de junio de 2019 18:51
  • Como podría convertir el model de mvc a las entidades de EF

    Yo he tratado de hacerlo de la siguiente manera

    EF me ha creado una clase entidad de la siguiente manera

        public partial class Categoria
        {
            
            public Categoria()
            {
                this.Articulo = new HashSet<Articulo>();
            }
        
            public int CatId { get; set; }
            public string CatNombre { get; set; }
        
            
            public virtual ICollection<Articulo> Articulo { get; set; }
        }

    yo he pensado crear en la capa Entities una clase Modelo de la siguiente manera

        public  class ModeloCategoria
        {
            public int CatId { get; set; }
            public string CatNombre { get; set; }
        }
    }

    Y en mi capa datos hago lo siguiente para listar mis categorias

     public class CategoriaDAL
        {
            public  List<ModeloCategoria> ListarCategorias()
            {
                using (ProductosEntities bd = new ProductosEntities())
                {
                    return bd.Categoria.Select(MapearAplicacion).ToList();
    
                }
            }
    
    
            //metodo para covertir modelo a clase ef
            private ModeloCategoria MapearAplicacion(Categoria cat)
            {
                return new ModeloCategoria()
                {
                    CatId = cat.CatId,
                    CatNombre = cat.CatNombre
                };
            }
    
            private Categoria MapearBD(ModeloCategoria modelo)
            {
                return new Categoria()
                {
                    CatId = modelo.CatId,
                    CatNombre = modelo.CatNombre
                };
            }
        }


    en mi capa de negocios hago lo siguiente

     public class CategoriaBL
        {
    
            public static List<ModeloCategoria> ListarCategorias()
            {
                CategoriaDAL cat = new CategoriaDAL();
                return cat.ListarCategorias();
            }
    
    
    
            private static Categoria MapearBD(ModeloCategoria modelo)
            {
                return new Categoria()
                {
                    CatId = modelo.CatId,
                    CatNombre = modelo.CatNombre
                };
            }
    
            private static ModeloCategoria MapearAplicacion(Categoria cat)
            {
                return new ModeloCategoria()
                {
                    CatId = cat.CatId,
                    CatNombre = cat.CatNombre
                };
            }
    
        }

    Pero me surge la duda que los metodos para convertir el modelo a las clases entidades lo tengo que implementar en la capa de negocios y en la capa de datos(no se si sea la mejor opcion)

    Por ultimo en mi controlador tengo lo siguiente

            public ActionResult Index()
            {
                var cat = CategoriaBL.ListarCategorias();
                return View(cat);
            }

    No se si esta sea la manera correcta de hacerlo.

    o me podrias indicar Leandro como hacerlo en la Carpeta Models tal como tu lo indicas

    domingo, 30 de junio de 2019 22:18
  • hola

    >>Pero me surge la duda que los metodos para convertir el modelo a las clases entidades lo tengo que implementar en la capa de negocios y en la capa de datos

    porque dos veces, llava esa funcionalidad a uan tercer clase de mapping y listo

    public static class CategoriaMapper{
    
    
    	private static Categoria MapearBD(ModeloCategoria modelo)
    	{
    		return new Categoria()
    		{
    			CatId = modelo.CatId,
    			CatNombre = modelo.CatNombre
    		};
    	}
    
    	private static ModeloCategoria MapearAplicacion(Categoria cat)
    	{
    		return new ModeloCategoria()
    		{
    			CatId = cat.CatId,
    			CatNombre = cat.CatNombre
    		};
    	}
    
    }

    Pero la conversion solo la aplicas en el controller para pasarla al BL, despues hacia atras continuas usando la clase del negocio

    la class del model de mvc solo se usa en la capa de presentacion, hacia la BL y demas se usa la clase de dominio

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 1 de julio de 2019 1:43
  • Desde mi punto de vista, es diferente a como lo ves.

    Veo que estas entendiendo como capa a una dll o componente y yo no lo veo asi.

    Una capa se puede componer de N componentes o dlls. Por ejemplo en las arquitecturas que yo manejo que logre después de varios proyectos en diferentes empresas y varios manuales que he leido. Mi capa de Negocio o de Dominio se compone de los siguientes Componentes o dlls.

    Capa Negocio o Domino

    1.- Dll EntitiesPoco = EL mapeo de las tablas de tu base de datos en clases EF.

    2.- Dll Entities = Todos los objetos que realizan logica. Muchas veces como desarrolladores metemos logica en los datos desde mi humilde opinión esta mal. Ejemplo una clase factura requiere un folio. Muchos implementan la lógica del folio en la clase factura pero una factura no se pone el folio sola. Si nos basamos en el mundo real existe el objeto foleador que recibe facturas y les asigna el folio. Por eso creo la Dll entities que tiene esa clase de objetos de negocio.

    3.- Dll de Interfaces de Datos = Esta dll contiene las interfaces para los repositorios de la capa de datos que quiere decir interfaces con las operaciones CRUD.

    4.- Dll ServiceManager = esta dll contiene los servicios del negocio que quiere decir que tendra clases de servico que retornaran las listas List<T> hacia los servicios Web o Presentacion. Esta dll es la expone tu logica y tus objetos en modo de listas.

    Con estos cuatro Dlls tu tienes control total de tu logica de negocio.

    Ahora las EntitiesPoco viajan por toda la aplicacion Y la Dll de ServiceManager es usada por tu servicio o por tu Presentacion.

    EntitiesPoco si tiene un Using en tu MVC por que es la informacion que viaja

    Estas son retornadas por tu service Manager osea tu controlador tiene un using a ServiceManager y a EntitiesPoco

    Y allí si tienes definido un modelo de vista haces el mapeo a to Modelo que es parte de tu presentación.

    Imagina que estas en tu controller Cliente. y tienes tu Modelo Cliente.

    Bueno tu controlles Cliente hara esto

    ServiceManager service = new ServiceManager();
    
    ModeloCliente cliente = (from item in service.BuscarCliente(id)
    Select New cliente()
    {
        id = item.Id,
        Nombre = item.Nombre
    }).FirstOrDefault();

    y asi estarias obteniendo y mapeando tus entidadesPoco con tu modelo de datos

    lunes, 1 de julio de 2019 16:41