AutoMapper将DTO通用转换为服务层中的域实体

时间:2018-09-19 14:16:08

标签: c# .net asp.net-mvc generics automapper

在基于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 :(得分:0)

首先,您应该获得带有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;