目录

一、定义源映射类和被映射类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 = "双眼皮", Mouth = "红润", Age = , IsMarried = false };
PhysicalAttribute physical = new PhysicalAttribute() { Eye = "双眼皮", Mouth = "红润" };
SocialAttribute social = new SocialAttribute() { Name = "张三", IsMarried = false, Age = };
PeopleDto output = new DtoHelper(scope.Resolve<IMapper>()).GetDto(physical, social);
//Assert.Same(result, output);
Assert.Equal(JsonConvert.SerializeObject(result), JsonConvert.SerializeObject(output));
} }
}

通过测试!

参考项目:https://github.com/FB208/CodeSpace/tree/master/CodeSpace.CSharp/WebMvc/DemoClass/AutoMapperDemo

NetCore+AutoMapper多个对象映射到一个Dto对象的更多相关文章

  1. C++ //拷贝构造函数调用时机//1.使用一个已经创建完毕的对象来初始化一个新对象 //2.值传递的方式给函数参数传值 //3.值方式返回局部对象

    1 //拷贝构造函数调用时机 2 3 4 #include <iostream> 5 using namespace std; 6 7 //1.使用一个已经创建完毕的对象来初始化一个新对象 ...

  2. modelMapper使用,将数据库查询对象直接转成DTO对象

    1.pom引入 <dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmap ...

  3. Java 将两个Map对象合并为一个Map对象

    实现方式是通过 putAll() 方法将多个 map 对象中的数据放到另外一个全新的 map 对象中,代码如下所示,展示了两个 map 对象的合并,如果是多个 map 合并也是用这种方式. publi ...

  4. 关于iOS上的对象映射公用方法-备

    具体的使用方法,请见下面说明,或者见工程里的单元测试代码.或者,参考原始文档: https://github.com/mystcolor/JTObjectMapping 使用方法 ======== 绝 ...

  5. ASP.NET MVC 模型和数据对象映射实践

    在使用 MVC 开发项目的过程中遇到了个问题,就是模型和数据实体之间的如何快捷的转换?是不是可以像 Entity Framework 的那样 EntityTypeConfiguration,或者只需要 ...

  6. PHP 设计模式 笔记与总结(9)数据对象映射模式

    [数据对象映射模式] 是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作.例如在代码中 new 一个对象,使用数据对象映射模式就可以将对象的一些操作比如设置一些属性,就会自动保存到数 ...

  7. C# 通过反射实现对象映射:将2个属性相近的对象相互转换

    前言 我们在编程过程中,经常需要将一个对象转成另一个对象(一般称为对象映射). 比如我们有2个类: //第1个类 CLS1 class CLS1 { public int i {get; set;} ...

  8. Redis OM .NET Redis对象映射框架

    Redis OM Redis OM 是 Redis 官方推出的对象映射框架,即:Object Mapping.让开发人员更简单.方便的操作 Redis 数据.Redis 存储的数据抽象为对象映射,支持 ...

  9. js中如何返回一个存放对象的数组?

    我这边需要返回后台数据的形式是这样的 {[ { ", }, { ", }, { ", }, { ", }, { ", } ]} 页面是通过循环去获取每 ...

随机推荐

  1. Java中使用RestFul接口上传图片到阿里云OSS服务器

    1.接口方法 import java.io.IOException; import javax.servlet.http.HttpServletRequest; import org.springfr ...

  2. 移动开发-UI设计

        UI:手机的用户界面 UI物理版:手机实际的屏幕像素 UI设计版:我们截屏的手机界面在ps中去量,发现的尺寸 UI放大版:手机的尺寸等比放大1.5倍得出的分辨率   响应式布局 原由:窗体缩小 ...

  3. Kali Linux无法访问网络的问题

    首先 ping www.baidu.com ping: unkown host www.baidu.com 然后 ping 8.8.8.8 connect:network is unreachable ...

  4. 图数据库 Nebula Graph 的数据模型和系统架构设计

    Nebula Graph:一个开源的分布式图数据库.作为唯一能够存储万亿个带属性的节点和边的在线图数据库,Nebula Graph 不仅能够在高并发场景下满足毫秒级的低时延查询要求,而且能够提供极高的 ...

  5. 回顾js中的cookie/localstorage

    1.首先简单总结下cookie cookie:可以做会话跟踪 特点:      1.大小限制(不能超过4k)      2.每个域下cookie不能超过50个      3.有效期(和设定时间有关), ...

  6. nanopi NEO2 学习笔记 2:安装 pip 和 pip 安装第三方模块

    我现在越来越喜欢用python做开发了,特别是知道了python还能用rpi.gpio库操作 NEO2 的 io 口之后,更是激动 在进行一下的操作之前,要先更换国内的 apt arm64 源,并更新 ...

  7. 宝塔安装Lsky Pro图床教程

    欢迎访问我的个人博客皮皮猪:http://www.zhsh666.xyz Lsky Pro图床是一个支持本地.阿里云 OSS.腾讯云 COS.七牛云.又拍云等储存方式的基于PHP的开源图床. 项目主页 ...

  8. 剖析nsq消息队列(一) 简介及去中心化实现原理

    分布式消息队列nsq,简单易用,去中心化的设计使nsq更健壮,nsq充分利用了go语言的goroutine和channel来实现的消息处理,代码量也不大,读不了多久就没了.后期的文章我会把nsq的源码 ...

  9. Codeforces 1204C

    题意略. 思路:我的想法是逐步地找出这个序列中的重要点,我要判断当前这个点能不能删去,就要看上一个重要点和当前这个点 i 在序列中的下一个点 i + 1之间的距离 是否是最短距离,如果是,那么我们就可 ...

  10. 基于JRebel开发的MySQL Explain插件

    前言 我们在使用数据库时,为了使业务系统性能达到最优,往往都需要避免慢SQL查询,不能等到线上告警了再排查是否为慢SQL导致.在开发阶段,每个开发人员就应该针对自己写的SQL看是否可能为慢SQL,从而 ...