none
Tipos dimanicos con AutoMapper RRS feed

  • Pregunta

  • Hola a todos, tengo la siguiente duda, tengo una clase abstracta que encapsula los métodos básicos CRUD por medio de Entity Framework y dinamicamente <T> resuelve el tipo de objeto que se va a trabajar pero no se como decirle que de un tipo T me entregue su correspondiente DTO. Estoy Trabajando con AutoMapper. dejo las clases

    namespace users.data.Impl
    {
        public abstract class BaseRepository<T> : IRepository<T> where T : class
        {
            protected readonly DbContext Context = new DbContext("UsersEntities");        
    
            public List<T> GetAll()
            {
                using (var context = Context)
                {
                    return context.Set<T>().ToList();
                }
            }
    
            public T Single(Expression<Func<T, bool>> predicate)
            {
                using (var context = Context)
                {
                    return context.Set<T>().FirstOrDefault(predicate);
                }
            }
    
            public List<T> Filter(Expression<Func<T, bool>> predicate)
            {
                using (var context = Context)
                {
                    return context.Set<T>().Where(predicate).ToList();
                }
            }
    
            public void Create(T entity)
            {
                throw new NotImplementedException();
            }
    
            public void Update(T entity)
            {
                throw new NotImplementedException();
            }
    
            public void Delete(T entity)
            {
                throw new NotImplementedException();
            }
    
            public void Delete(Expression<Func<T, bool>> predicate)
            {
                throw new NotImplementedException();
            }
        }
    }

    En este caso T puede ser por ejemplo User que es una entidad la cual se encuentra en la base de datos pero necesito devolver "UserDto" de que forma podría hacerlo con AutoMapper? acá dejo la implementación de un repositorio especifico.

    namespace users.data.Impl
    {
        public class UserRepository: BaseRepository<User>, IUserRepository
        {
            public UserDto GetById(int id)
            {
                using (var context = Context)
                {
                    var user = context.Set<User>().FirstOrDefault(x => x.Id == id);
                    var userDto = Mapper.Map<User, UserDto>(user);
                    return userDto;
                }
            }
        }
    }

    Mil gracias.


    Sergio Ríos G.

    martes, 9 de diciembre de 2014 1:36

Respuestas

  • hola

    es que automapper no tinee nada que ver con Repository, desde el repositorio no devuelves NUNCA una clase Dto

    desde el repository devuelve un User, luego es que lo conviertes, podria ser tu capa de servicio, o de aplicacion quien se encargue

    pero la conversion va luego de recuperar la entidad desde el repository

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 9 de diciembre de 2014 3:47

Todas las respuestas

  • hola

    es que automapper no tinee nada que ver con Repository, desde el repositorio no devuelves NUNCA una clase Dto

    desde el repository devuelve un User, luego es que lo conviertes, podria ser tu capa de servicio, o de aplicacion quien se encargue

    pero la conversion va luego de recuperar la entidad desde el repository

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 9 de diciembre de 2014 3:47
  • Ok perfecto así lo haré, Una ultima duda, ya que me has ayudado a aclarar tantos conceptos:

    Tengo mi proyecto de esta forma:

    users.services -> Web API
    users.models -> DTOS
    users.facade -> Public interfaces
    users.data -> EF

    La idea mía es tener todas las interfaces en la capa users.facade pero me queda la duda de donde debería tener el modelo EF (.edmx) ya que si lo tengo en la capa users.data no podría referenciar los objetos desde la capa users.facade ya que necesitaría una referencia al proyecto users.data y se generaría una dependecia ciclica.

    Estaría bien tener el modelo edmx en la capa users.facade?

    o debería tener las interfaces de la capa users.data en la misma capa?

    Mil gracias y que pena por tantas preguntas.


    Sergio Ríos G.

    martes, 9 de diciembre de 2014 13:24
  • hola

    no te animas a usar EF Code First ? porque con este podrias separar las entidades de dominio de la definicion del context

    si no puedes y necesitas del edmx quizas tenga que separar la generacion del codigo del modelo edmx


    Using the POCO T4 Code Generation Template for Entity Data Models

    al separar las clase en otro proyecto podrias referencialro sin el problema de referencia circular

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 9 de diciembre de 2014 15:26