返回总目录


首先,先创建一个控制台项目,引用AutoMapper程序集,创建三个类User,UserDto,UserMappingProfile,下面的知识点的演示都以此项目为基础,代码分别如下:

namespace MiddleAutoMapper
{
public class User
{
public User()
{
}
public int Age { get; set; }
}
}
namespace MiddleAutoMapper
{
public class UserDto
{
public UserDto(int age)
{
this.age = age;
} private int age;
public int Age
{
get { return age; }
}
}
}
namespace MiddleAutoMapper
{
public class UserMappingProfile:Profile
{
protected override void Configure()
{
//添加配置方法 }
}
}
namespace MiddleAutoMapper
{
class Program
{
static void Main(string[] args)
{
//初始化配置
Mapper.Initialize(cfg =>
{
cfg.AddProfile<UserMappingProfile>();
}); var u1 = Mapper.Map<UserDto>(new User() {Age = });
Console.WriteLine(u1.Age); Console.Read();
}
}
}

构造

AutoMapper可以根据源类型的成员映射到目标类型的构造函数里:

在UserMappingProfile文件中添加配置方法代码:

Mapper.CreateMap<User, UserDto>();

因为AutoMapper会对大小不敏感(case insensitive),所以会将User的Age属性通过UserDto的构造函数进行映射,并对UserDto的私有字段赋值,最后通过公有的Age属性打印出来。

但是,这是在UserDto的构造函数参数名和User的Age属性名相同的情况下,如果不相同呢?比如,将构造函数的参数名改为age1呢?

发现报错了,所以我们要修改配置方法,如下:

Mapper.CreateMap<User, UserDto>().ForCtorParam("age1", opt => opt.MapFrom(src => src.Age));

解释一下ForCtorParam()方法,看名字是针对构造函数参数的,官方解释该方法的作用是对于个别的构造函数参数进行自定义配置。该方法有两个参数,第一个是string类型的构造函数参数名,第二个是一个参数选项Action方法。

我上面这句代码的意思就是说将目标类型的构造函数的参数“age1”从源类型的Age属性进行映射。

容器

AutoMapper支持使用静态服务地址构造自定义值格式化器,自定义值解析器和自定义类型转换器(后面会说):

Mapper.Initialize(cfg =>
{
cfg.ConstructServicesUsing(ObjectFactory.GetInstance); cfg.CreateMap<Source, Destination>();
});

或者在基于实例的容器使用的动态服务地址(包括子容器或嵌套容器):

var dest = Mapper.Map<Source, Destination>(new Source { Value =  },
opt => opt.ConstructServicesUsing(childContainer.GetInstance));

惯例

条件对象映射器

条件对象映射器基于源类型和目标类型之间的条件生成新的类型映射。

首先将User和UserDto的构造函数去掉,配置文件中Configure方法中的代码只写入下面这句代码:

AddConditionalObjectMapper().Where((s, d) => d.Name == s.Name + "Dto");

解释:如果目标类型的名称等于源类型的名称加上“Dto”,那么就生成一个源类型和目标类型的对象映射器。添加了这一句,就不需要CreateMap方法了。

在这连个类中加入属性:

public string UserName { get; set; }

可见,即使没有使用CreateMap方法,同样映射成功了。

成员配置

成员配置就像配置(Configuration)一样,但是你可以完全控制用什么和不用什么。

Mapper.Initialize(cfg => { cfg.AddMemberConfiguration(); });

AddMemberConfiguration()方法以空白状态开启。默认情况下,应用到Configuration中的所有东西都是从这里开始的。

  • 命名惯例

    AddMemberConfiguration().AddMember<NameSplitMember>();

    这句代码可以获得默认的命名惯例。也可以通过参数传递Lambda重写源和目标的命名惯例。如果你没设置任何东西,那么AutoMapper会使用DefaultMember,它会只检测用到的属性名称。PS:如果没设置这个,那么对象的扁平化(Flattening)就不可用。

  • 替换字符
    AddMemberConfiguration().AddName<ReplaceName>(_ => _.AddReplace("Ä", "A").AddReplace("í", "i"));
  • 识别前后缀
    AddMemberConfiguration().AddName<PrePostfixName>(_ => _.AddStrings(p => p.Prefixes, "Get", "get").AddStrings(p => p.DestinationPostfixes, "Set"));
  • 特性支持
    AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>();

    这个默认总是开启的。它会寻找含有“SourceToDestinationMapperAttribute”特性的属性所在的实例,并且调用用户定义的isMatch函数类找出匹配的成员。
    MapToAttribute是特性之一,它可以匹配基于给定名称的属性。
    在User类中加入代码:

    [MapToAttribute("Phone")]
    public string Tel { get; set; }

    在UserDto中加入代码:

    public string Phone { get; set; }

    在Main方法中加入代码:

    var u3 = Mapper.Map<UserDto>(new User() {Tel = ""});
    Console.WriteLine(u3.Phone);//

    执行结果如下:

  • 获取AutoMapper默认值
    AddMemberConfiguration().AddMember<NameSplitMember>().AddName<PrePostfixName>(_ => _.AddStrings(p => p.Prefixes, "Get"))

    如果没使用AddMemberConfiguration方法,那么这就是Configuration设置的默认值。

扩展性

AddName和AddMember中的每个类型都是基于ISourceToDestinationNameMapper和IChildMemberConfiguration接口的。也可以创建自己的类通过Lambda语句参数来配置属性,因此你可以微调AutoMapper如何解析属性映射。

配置文件

配置文件可以加到Profile和ConfigurationStore中。

每一个配置文件都独立于另外一个,且不会共享任何条件。如果一个映射是从一个配置文件(profile)中的AddConditionalObjectMapper生成的,那么可以使用此配置文件的AddMemberConfigurations来解析属性映射。

AutoMapper(二)的更多相关文章

  1. 从我做起[AutoMapper实现模块化注册自定义扩展MapTo<>()].Net Core 之二

    AutoMapper实现模块化注册自定义扩展MapTo<>() 我们都知道AutoMapper是使用的最多的实体模型映射,如果没有AutoMapper做对象映射那么我们需要想一下是怎么写的 ...

  2. AutoMapper的介绍与使用(二)

    AutoMapper的匹配 1,智能匹配 AutoMapper能够自动识别和匹配大部分对象属性: 如果源类和目标类的属性名称相同,直接匹配,不区分大小写 目标类型的CustomerName可以匹配源类 ...

  3. DTO学习系列之AutoMapper(二)

    本篇目录: Flattening-复杂到简单 Projection-简单到复杂 Configuration Validation-配置验证 Lists and Array-集合和数组 Nested m ...

  4. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)

    前言: 在本系列第一篇<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](一)>中,我为大家介绍了搭建空白解决方案以 ...

  5. ioc初步理解(二) 简单实用autofac搭建mvc三层+automapper=》ioc(codeFirst)

    之前在园子闲逛的时候,发现许多关于automapper的文章,以及用aotufac+automapper合在一起用.当然发现大多数文章是将automapper的特点说出或将automapper几处关键 ...

  6. AutoMapper

    什么是AutoMapper? AutoMapper是一个对象和对象间的映射器.对象与对象的映射是通过转变一种类型的输入对象为一种不同类型的输出对象工作的.让AutoMapper有意思的地方在于它提供了 ...

  7. 使用Adminlite + ASP.NET MVC5(C#) + Entityframework + AutoFac + AutoMapper写了个api接口文档管理系统

    一.演示: 接口查看:http://apidoc.docode.top/ 接口后台:http://apiadmin.docode.top/ 登录:administrator,123456 二.使用到的 ...

  8. 使用AutoMapper进行对象间映射

    在开发过程中,难免遇到下面这种情况:两个(或多个)对象所拥有的大多数属性是重复的,我们需要在对象间进行映射(即将一个对象的属性值赋给另一个对象.通常我们可以进行如下操作: A a=new A(); a ...

  9. AutoMapper 使用实践

    一.   使用意图 常常在开发过程中,碰到一个实体上的属性值,要赋值给另外一个相类似实体属性时,且属性有很多的情况.一般不利用工具的话,就要实例化被赋值实体B,然后再将实体A的字段一个个赋值给B的属性 ...

随机推荐

  1. NiceMark——我的Markdown编辑器

    NiceMark--我的Markdown编辑器 闲来无事,写了一个Markdown编辑器.基于electron,完全采用Web前段技术(Html,css,JavaScript)实现.代码已托管在Git ...

  2. Android Studio 多个编译环境配置 多渠道打包 APK输出配置

    看完这篇你学到什么: 熟悉gradle的构建配置 熟悉代码构建环境的目录结构,你知道的不仅仅是只有src/main 开发.生成环境等等环境可以任意切换打包 多渠道打包 APK输出文件配置 需求 一般我 ...

  3. Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新

    因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...

  4. 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)

    在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...

  5. Android之ContentProvider数据存储

    一.ContentProvider保存数据介绍 一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数 ...

  6. CentOS 7 修改主机名

    今天在阿里云上买了一个centos7的服务器,连接上以后,发现一个很长很长的主机名,看着让人很是不爽,就想着怎样将其改成一个有个性的名字. 这里我想说的是,在centos7 版本的linux系统上和c ...

  7. linux启动SSH及开机自动启动

    本文地址 分享提纲: 1.查看是否启动 2. 设置自动启动 1.[查看是否启动] 启动SSH服务 “/etc/init.d/sshd start”.然后用netstat -antulp | grep ...

  8. 《CPU的工作过程》

    本文转载自inter官方网址:https://software.intel.com/zh-cn/articles/book-Processor-Architecture_CPU_work_proces ...

  9. 二叉树的创建和遍历(C版和java版)

    以这颗树为例:#表示空节点前序遍历(根->左->右)为:ABD##E##C#F## 中序遍历(左->根->右)为:#D#B#E#A#C#F# 后序遍历(左->右-> ...

  10. CYQ.Data V5 分布式自动化缓存设计介绍

    前方: 其实完成这个功能之前,我就在思考:是先把想法写了来,和大伙讨论讨论后再实现,还是实现后再写文论述自己的思维. 忽然脑后传来一个声音说:你发文后会进入发呆阶段. 所以还是静下心,让我轻轻地把代码 ...