欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

NetCore+AutoMapper多个对象映射到一个Dto对象

程序员文章站 2022-05-03 10:33:57
目录 一、定义源映射类和被映射类DTO 二、注入AutoMapper 三、配置映射 四、调用AutoMapper完成赋值 五、运行测试 一、定义源映射对象 为了体现AutoMapper映射特性,在SocialAttribute中的Name属性没有定义在People中,People的Ear属性也不存在 ......

 

目录

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

二、注入automapper

三、配置映射

四、调用automapper完成赋值

五、运行测试

 

一、定义源映射对象

为了体现automapper映射特性,在socialattribute中的name属性没有定义在people中,people的ear属性也不存在与socialattribute和physicalattribute中。

NetCore+AutoMapper多个对象映射到一个Dto对象

 

 

 代码如下:

    /// <summary>
    /// 身体属性
    /// </summary>
    public class physicalattribute
    {
        public string eye { get; set; }
        public string mouth { get; set; }
    }
    /// <summary>
    /// 社会属性
    /// </summary>
    public class socialattribute
    {
        public int age { get; set; }
        public bool ismarried { get; set; }
        public string name { get; set; }
    }
    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; }
    }

 

二、注入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 = "双眼皮", mouth = "红润", age = 18, ismarried = false };
                physicalattribute physical = new physicalattribute() { eye = "双眼皮", mouth = "红润" };
                socialattribute social = new socialattribute() { name = "张三", ismarried = false, age = 18 };
                peopledto output = new dtohelper(scope.resolve<imapper>()).getdto(physical, social);
                //assert.same(result, output);
                assert.equal(jsonconvert.serializeobject(result), jsonconvert.serializeobject(output));
            }

        }
    }

通过测试!

NetCore+AutoMapper多个对象映射到一个Dto对象

 

 参考项目:https://github.com/fb208/codespace/tree/master/codespace.csharp/webmvc/democlass/automapperdemo