如何使用自动映射器映射此复杂类型

本文关键字:映射 复杂 类型 何使用 | 更新日期: 2023-09-27 17:55:24

我必须映射每个属性,因为属性名称不匹配。

我是如何手动完成的:

        var api = new MovieApi();
        var movie = await api.GetMovieAsync(id);
        var images = await api.GetMovieImages(movie.id);
        var configuration = await api.GetConfiguration();
            //Start the main mapping
            var model = new MovieViewModel()
            {
                Title = movie.title,
                Overview = movie.overview,
                ReleaseDate = movie.release_date,
                Status = movie.status,
                Tagline = movie.tagline,
                VoteAverage = movie.vote_average,
                VoteCount = movie.vote_count,
                Revenue = movie.revenue,
                Video = movie.video,
                TmdbId = movie.id,
                Images = new List<Images>(),
                Genre = new List<Genre>()
                {
                    //Map the Genre
                    new Genre()
                    {
                        Id = movie.genres[0].id,
                        Name = movie.genres[0].name
                    }
                }
            };
            //Add images to the model if they exist.
            if (images.backdrops != null)
            {
                foreach (var image in images.backdrops)
                {
                    model.Images.Add(new Images()
                    {
                        VoteAverage = image.vote_average,
                        VoteCount = image.vote_count,
                        AspectRatio = image.aspect_ratio,
                        FilePath = image.file_path,
                        Height = image.height,
                        Iso6391 = image.iso_639_1,
                        Width = image.width,
                        FullImageUri =
                            new Uri(configuration.images.base_url + configuration.images.backdrop_sizes[3] +
                                    image.file_path)
                    });
                }
            }

这是我对自动映射器的尝试

       public MovieViewModel MapForDetails(MovieContent movie, Backdrop images, Configuration config)
    {
        var model = new MovieViewModel();
        Mapper.CreateMap<MovieContent, MovieViewModel>()
            .ForMember(d => d.Title, o => o.MapFrom(s => s.title))
            .ForMember(d => d.Overview, o => o.MapFrom(s => s.overview))
            .ForMember(d => d.TmdbId, o => o.MapFrom(s => s.id))
            .ForMember(d => d.ReleaseDate, o => o.MapFrom(s => s.release_date))
            .ForMember(d => d.Popularity, o => o.MapFrom(s => s.popularity))
            .ForMember(d => d.VoteAverage, o => o.MapFrom(s => s.vote_average))
            .ForMember(d => d.VoteCount, o => o.MapFrom(s => s.vote_count))
            .ForMember(d => d.Status, o => o.MapFrom(s => s.status))
            .ForMember(d => d.Tagline, o => o.MapFrom(s => s.tagline))
            .ForMember(d => d.Revenue, o => o.MapFrom(s => s.revenue))
            .ForMember(d => d.Video, o => o.MapFrom(s => s.video))
            .ForMember(d => d.TmdbId, o => o.MapFrom(s => s.id))
            //.ForMember(d => d.Genre, o => o.MapFrom(s => s.genres))
            .ForMember(d => d.Images, o => o.MapFrom(s => new List<MovieImages>()));
        model = Mapper.Map<MovieContent, MovieViewModel>(movie);
        Mapper.CreateMap<Backdrop, MovieViewModel>()
            .ForMember(d => d.Images.Select(x => x.Width), o => o.MapFrom(s => s.width))
            .ForMember(d => d.Images.Select(x => x.Iso6391), o => o.MapFrom(s => s.iso_639_1))
            .ForMember(d => d.Images.Select(x => x.VoteAverage), o => o.MapFrom(s => s.vote_average))
            ;
        model.Images = (Mapper.Map<Backdrop, MovieViewModel>(images).Images);
        return model;
    }

我收到异常:

AutoMapper.AutoMapperConfigurationException : Custom configuration for members is only supported for top-level individual members on a type.

我不确定如何将其映射到MovieContent对象?

如何使用自动映射器映射此复杂类型

配置:

Mapper.CreateMap<MovieContent, MovieViewModel>()
            .ForMember(d => d.Title, o => o.MapFrom(s => s.title))
            .ForMember(d => d.Overview, o => o.MapFrom(s => s.overview))
            .ForMember(d => d.TmdbId, o => o.MapFrom(s => s.id))
            .ForMember(d => d.ReleaseDate, o => o.MapFrom(s => s.release_date))
            .ForMember(d => d.Popularity, o => o.MapFrom(s => s.popularity))
            .ForMember(d => d.VoteAverage, o => o.MapFrom(s => s.vote_average))
            .ForMember(d => d.VoteCount, o => o.MapFrom(s => s.vote_count))
            .ForMember(d => d.Status, o => o.MapFrom(s => s.status))
            .ForMember(d => d.Tagline, o => o.MapFrom(s => s.tagline))
            .ForMember(d => d.Revenue, o => o.MapFrom(s => s.revenue))
            .ForMember(d => d.Video, o => o.MapFrom(s => s.video))
            .ForMember(d => d.TmdbId, o => o.MapFrom(s => s.id))
            .ForMember(d => d.Genre, o => o.Ignore())
            .ForMember(d => d.Images, o => o.Ignore());
Mapper.CreateMap<Backdrop, Images>()
            .ForMember(d => d.Width, o => o.MapFrom(s => s.width))
            .ForMember(d => d.Iso6391, o => o.MapFrom(s => s.iso_639_1))
            .ForMember(d => d.VoteAverage, o => o.MapFrom(s => s.vote_average));

映射代码:

var model = new MovieViewModel();
model = Mapper.Map<MovieContent, MovieViewModel>(movie);
//Check if Null
if (images.backdrops != null)
{
    model.Images = Mapper.Map<IEnumerable<Backdrop>, IEnumerable<Images>>(images.backdrops);
}