如何在将Dto对象传递给业务层之前将其转换为实体

时间:2017-06-19 19:57:30

标签: asp.net-mvc automapper

我在.Net的业务层实现了Automapper。这些方法是异步任务。方法GetAllMovies()编译AddMovie没有的位置。我需要在将Dto传递给服务方法之前将其转换为实体。我该怎么做呢

方法

       public async Task<long> AddMovie(MoviesDto movie)
        {
            return await _movieService.AddMovie(movie);

        }

        public async Task<IEnumerable<MoviesDto>> GetAllMovies()
        {
            var movies = await _movieService.GetMovies();
            return Mapper.Map<List<MoviesDto>>(movies);
        }

电影服务

public class MovieService : IMovieService
    {
        IUnitOfWork _unitOfWork;
        public MovieService(IUnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;
        }

        public async Task<long> AddMovie(Movie movie)
        {
            return await _unitOfWork.movieRepository.AddMovie(movie);
        }


        public async Task<IEnumerable<Movie>> GetMovies()
        {
            return await _unitOfWork.movieRepository.GetMovies();
        }
    }

AutoMapper

public class DomainToDtoMapping : Profile
    {
        public DomainToDtoMapping()
        {
            CreateMap<BaseEntity, BaseDto>().ReverseMap();
            CreateMap<Movie, MoviesDto>().ReverseMap();

        }
    }

StructureMap

public DefaultRegistry()
        {
            Scan(
                scan =>
                {
                    scan.TheCallingAssembly();
                    scan.WithDefaultConventions();
                });
            //For<IExample>().Use<Example>();

            For<IConnectionFactory>().Use<ConnectionFactory>();
            //For<IMovieRepository>().Use<MovieRepository>().Ctor<FileInfo>().Is(myFile);
            For<IUnitOfWork>().Use<UnitOfWork>();
            For<IMovieService>().Use<MovieService>();
            For<IMovieBusiness>().Use<MovieBusiness>();
        }

1 个答案:

答案 0 :(得分:1)

您错过了发布一些代码:

  • 您的MovieService是什么样的?
  • 您使用的是实体框架吗?
  • 您的AutoMapper.Initialize设置

如果MovieDbo(或调用任何数据库类)没有引用任何其他数据库对象(通过导航属性),则可以在适当配置后调用Mapper.Map<MovieDbo>(movie)

当您的DBO具有导航属性时,它变得越来越复杂,使用new创建常规对象可以避免很多麻烦。

更新

试试这个。就像我说的那样,如果Movie没有任何导航属性,那就不会有任何问题。如果确实如此,只需创建一个新实例并手动映射属性。

public async Task<long> AddMovie(MoviesDto movie)
{
    return await _movieService.AddMovie(AutoMapper.Map<Movie>(movie));

}