AutoMapper Общее преобразование DTO в сущность домена на сервисном уровне - PullRequest
0 голосов
/ 19 сентября 2018

В сервисном уровне моего приложения на основе ASP.Net MVC у меня есть абстрактный сервис, который настроен так:

public abstract class Service<TEntity, TDto> : IService<TDto> 
where TEntity : BaseEntity where TDto : IBaseDto
    {
        private readonly IUnitOfWork _unitOfWork;
        private readonly IGenericRepository<TEntity> _repository;

        protected Service(IUnitOfWork unitOfWork, IGenericRepository<TEntity> repository)
        {
            _unitOfWork = unitOfWork;
            _repository = repository;
        }     


        public virtual void Create(TDto entity)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }
            //--------------------------------------------------
            // HOWTO: Convert from TDto to TEntity
            //--------------------------------------------------
            _repository.Add(entity);
            _unitOfWork.Commit();         
        }
}

Цель состоит в том, чтобы сохранить общие методы в этом абстрактном классе, чтобы я не повторялэто в каждой реализации сущностей.

Теперь проблема в том, что мне нужен какой-то способ преобразования TDto в TEntity в методе Create(TDto entity), описанном выше.Я не могу понять, как я могу сделать это с AutoMapper.

1 Ответ

0 голосов
/ 19 сентября 2018

Сначала вы должны получить экземпляр сопоставителя с DI:

private IMapper _mapper;

protected Service(IUnitOfWork unitOfWork, IGenericRepository<TEntity> repository, IMapper mapper)
{
    _unitOfWork = unitOfWork;
    _repository = repository;
    _mapper = mapper;
}

Затем вы можете использовать этот экземпляр _mapper для сопоставления вашего dto с вашей сущностью следующим образом:

public virtual void Create(TDto dto)
{
    if (dto == null)
    {
        throw new ArgumentNullException("dto");
    }
    var entity = _mapper.Map<TEntity>(dto);
    _repository.Add(entity);
    _unitOfWork.Commit();         
}

С конфигурацией сопоставления что-то вроде:

var mapConfig = new MapperConfiguration(config =>
{
    config.CreateMap<Models.DtoModel, EntityModel>();
});

mapConfig.AssertConfigurationIsValid();

var iMapper = new Mapper(mapConfig) as IMapper;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...