设为首页 加入收藏

TOP

NetCore+AutoMapper多个对象映射到一个Dto对象(一)
2019-09-19 18:10:00 】 浏览:91
Tags:NetCore AutoMapper 多个 对象 映射 一个 Dto

 

目录

一、定义源映射类和被映射类DTO

二、注入AutoMapper

三、配置映射

四、调用AutoMapper完成赋值

五、运行测试

 

一、定义源映射对象

为了体现AutoMapper映射特性,在SocialAttribute中的Name属性没有定义在People中,People的Ear属性也不存在与SocialAttribute和PhysicalAttribute中。

 

 

 代码如下:

    /// <summary>
    /// 身体属性
    /// </summary>
    public class PhysicalAttribute
    {
        public string Eye { get; set; }
        public string Mouth { get; set; }
    }
PhysicalAttribute
    /// <summary>
    /// 社会属性
    /// </summary>
    public class SocialAttribute
    {
        public int Age { get; set; }
        public bool IsMarried { get; set; }
        public string Name { get; set; }
    }
SocialAttribute
    public class PeopleDto
    {
        public string Eye { get; set; }
        public string Mouth { get; set; }
        public string Ear { get; set; }
        public int Age { get; set; }
        public bool IsMarried { get; set; }
    }
PeopleDto

 

二、注入AutoMapper

例子中使用的IOC容器是Autofac,不使用Autofac的话,仅用NetCore框架集成的IOC容器也可以实现。

注册AutoMapper必要组件:

    public static class AutoMapperInjection
    {
        public static ContainerBuilder LoadAutoMapper(this ContainerBuilder builder)
        {
            builder.RegisterType<MapperConfigurationExpression>().SingleInstance();
            builder.Register(m => {
                var mapperConfigurationExpression = m.Resolve<MapperConfigurationExpression>();
                var instance = new MapperConfiguration(mapperConfigurationExpression);
                return instance;
            });
            builder.Register(m => {
                var mapperConfiguration = m.Resolve<MapperConfiguration>();
                return mapperConfiguration.CreateMapper();
            });
            return builder;
            
        }
    }

 

三、配置映射

ForMember:映射两个类之间的属性关系。

People类中的Ear属性并不存在于任何映射源类中,我们可以使用ForMember(m => m.Ear, n => n.Ignore())忽略该属性,当然也可以不写这段代码,对AutoMapper不会有任何影响,但是为了后期维护更方便,我比较习惯将Dto类的属性写全。

SocialAttribute类中的Name属性不存在与People类中,直接忽略它,Name也不会被AutoMapper赋值。

    public class AutoMapperProfile: Profile
    {
        public void Mapping(ILifetimeScope scope) {

            var expression = scope.Resolve<MapperConfigurationExpression>();
            expression.CreateMap<PhysicalAttribute, PeopleDto>()
            .ForMember(m => m.Eye, n => n.MapFrom(s => s.Eye))
            .ForMember(m => m.Mouth, n => n.MapFrom(s => s.Mouth));
            //.ForMember(m => m.Ear, n => n.Ignore());
            expression.CreateMap<SocialAttribute, PeopleDto>()
                .ForMember(m => m.Age, n => n.MapFrom(s => s.Age))
                .ForMember(m => m.IsMarried, n => n.MapFrom(s => s.IsMarried));
        }
    }

四、调用AutoMapper完成赋值

调用AutoMapper,将PhysicalAttribute和SocialAttribute的值赋给PeopleDto

    public class DtoHelper
    {
        private IMapper mapper;
        public DtoHelper(IMapper _mapper) {
            mapper = _mapper;
        }
        public PeopleDto GetDto(PhysicalAttribute physical,SocialAttribute social) {
            PeopleDto peopleDto = new PeopleDto();
            mapper.Map(social, mapper.Map(physical, peopleDto));
            return peopleDto;
        }
    }

 

五、运行测试

测试框架使用的xUnit

    public class DtoHelperTest
    {
        [Fact]
        public void GetDto() {
            //moke
            ContainerBuilder builder = new ContainerBuilder();
            builder.LoadAutoMapper();
            builder.RegisterType<AutoMapperProfile>();
            IContainer Container = builder.Build();
            using (var scope = Container.BeginLifetimeScope())
            {
                scope.Resolve<AutoMapperProfile>().Mapping(scope);
                PeopleDto result = new PeopleDto() { Eye = "双眼皮"
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇asp.net core 使用HttpClientFact.. 下一篇C# DATETIME格式转换汇总 根据日..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目