none
Aplicando Automapper RRS feed

  • Pregunta

  • Hola 

    Estoy trabajando en una app ASP.NET MVC 5 estoy aplicando automapper a un método en la capa de lógica pero no lo estoy haciendo bien.

    Persistencia.

    public static Proveedor Single(Expression<Func<Proveedor, bool>> predicate)
            {
                using (var context = new DemoContext())
                {
                    return context.Proveedores.FirstOrDefault(predicate);
                }
            }

    Lógica.

    public static ProveedorDto Single(Expression<Func<ProveedorDto, bool>> predicate)
            {
                config = new MapperConfiguration(cfg => cfg.CreateMap<Proveedor, ProveedorDto>());
                var proveedorDto = config.CreateMapper().Map<ProveedorDto>(predicate);
                return proveedorDto;
            }


    En el método que esta en la capa lógica estoy aplicando automapper pero no estoy llamando al método Single que esta en la capa de persistencia.

    Como puedo corregir ese problema? 


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


    • Editado Pedro Ávila miércoles, 25 de enero de 2017 17:29 ...
    • Cambiado Joyce_AC miércoles, 25 de enero de 2017 22:29
    miércoles, 25 de enero de 2017 17:27

Todas las respuestas

  • hola

    Pero alli veo que usas dos veces el CreateMapper() uno dentro del MapperConfiguration y despues junto al Map, eso no es correcto

    la idea es que en mvc definas los mappers de forma separada a donde los usas y no todo en el action

    Lo correcto seria integrar automapper con el dependency inyection que estes usando, no se si es unity. ninject, etc

    Where to place AutoMapper.CreateMaps?

    lo que comenta jpgrassi

    veras como defines clases Profile donde creas el mapping y luego en el controler inyectas el IMapper

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 25 de enero de 2017 18:34
  • aqui

     ASP MVC with Automapper Profiles

    aplica la misma tecnica quizas un poco mas simple, ya que no descubre dinamicamente lo profile con linq, sino que los asigna directamente

    pero la idea es usar la libreria de IoC para inyectar el IMapper

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 25 de enero de 2017 18:43
  • Hola Leandro

    El problemita es que es un proyecto de prueba en el cual estoy estudiando ASP.NET MVC y no estoy aplicando Ninject.

    No estoy usando ViewModel estoy usando Dto's, el automapper lo tengo instalado en la capa lógica y ahí es donde aplico. 

    De esta manera he venido usando automapper

    private static MapperConfiguration config; 
            public static IEnumerable<ProveedorDto> GetProveedor()
            {
                IEnumerable<Proveedor> proveedor = ProveedorRepository.GetProveedor();
                config = new MapperConfiguration(cfg => cfg.CreateMap<Proveedor, ProveedorDto>());
                IEnumerable<ProveedorDto> listDto = config.CreateMapper().Map<IEnumerable<ProveedorDto>>(proveedor);
                return listDto;
            }
    
            public static void Create(ProveedorDto entity)
            {
                config = new MapperConfiguration(cfg => cfg.CreateMap<ProveedorDto, Proveedor>());
                var proveedor = config.CreateMapper().Map<Proveedor>(entity);
                ProveedorRepository.Create(proveedor);
            }

    ¿El método Single no se podría solucionar de una manera mas sencilla?


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



    • Editado Pedro Ávila viernes, 27 de enero de 2017 0:33 ...
    viernes, 27 de enero de 2017 0:01
  • hola

    >>El problemita es que es un proyecto de prueba en el cual estoy estudiando ASP.NET MVC y no estoy aplicando Ninject.

    pero si es de prueba podrias tambien probar ninjuect o unity para realizar la prueba de forma completa como si fuera un desarrollo real

    >>No estoy usando ViewModel estoy usando Dto's,

    es indistinto, se supone que la capa logica deberia poder inyectarse

    >>De esta manera he venido usando automapper

    si analizamos

    Getting Started Guide

    pareciera esta correcto

    public static IEnumerable<ProveedorDto> GetProveedor()
    {
    	IEnumerable<Proveedor> proveedor = ProveedorRepository.GetProveedor();
    	
    	var config = new MapperConfiguration(cfg => cfg.CreateMap<Proveedor, ProveedorDto>());
    	var mapper = config.CreateMapper();
    	
    	IEnumerable<ProveedorDto> listDto = mapper.Map<IEnumerable<ProveedorDto>>(proveedor);
    	
    	return listDto;
    }

    solo separe en lineas la creacion del mapper

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 27 de enero de 2017 13:18
  • @Leandro

    Voy a agregar IoC para que sea una prueba real y te aviso como me fue.


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


    • Editado Pedro Ávila viernes, 27 de enero de 2017 14:14 ...
    viernes, 27 de enero de 2017 14:14