转载 AutoMapper在C#中的有趣应用 https://www.cnblogs.com/lvlinlv/p/7344916.html
最近发现了一个比较有趣的东西 AutoMapper,主要将Model转换为DTO,DTO更注重数据,对领域对象进行合理封装,从而不会将领域对象的行为过分暴露给表现层。
先来看一点实例,两个类之间的映射。
首先定义两个类Source与DTOSource:

1 public class Source
2 {
3 public int Id { get; set; }
4 public string Content { get; set; }
5 }
6
7 public class DTOSource
8 {
9 public int Id { get; set; }
10 public string Content { get; set; }
11 }

Source与DTOSource字段完全相同,来看看它俩如何通过AutoMapper转换,代码很简单。

1 Mapper.Initialize(x=>{
2 x.CreateMap<Source,DTOSource>();
3 });
4
5 Source s = new Source{Id=1,Content="123"};
6
7 DTOSource dto = Mapper.Map<DTOSource>(s);

第一步建立Source到DTOSource之间的映射,初始化一个Source实例后,来看下执行结果:

执行完成后,可以看到dto中的数据与之前初始化的s的数据是一样的,就像是直接将s拷贝了一份给dto,在两个类字段名定全相同的情况下如此,那么如果DTOSource中的字段名与Source中的不相同如何,其实也很简单,只需
要改成一点点的代码既可:
我们将DTOSource中的Content的字段名改成Desc,此时只需要建立映射关系时,指定字段就可以了:
1 Mapper.Initialize(x => {
2 x.CreateMap<Source, DTOSource>().ForMember(c=>c.Desc,q=> {
3 q.MapFrom(z => z.Content);
4 });
5 });
来看看运行结果如何;

可以看到与之前的运行结果是相同的。
那么如何映射两个List,其实也很简单,和上述代码几乎可以说是无差别,只是在最后一步时,要做一点点的修改就可以了。如下面代码:

1 Mapper.Initialize(x => {
2 x.CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q =>
3 {
4 q.MapFrom(z => z.Content);
5 });
6 });
7
8 s.Add(new Source { Id = 1, Content = "123" });
9
10 var dto = Mapper.Map<List<DTOSource>>(s);

可以看到除了最后一句代码,其它几乎是完全相同的,只是在最后一句代码中,目标类型改成了List<DTOSource>仅此而已。看下运行结果如何:

结果符合预期。
在实际的项目中,这样的写法肯定是不符合要求的,一般会做一个封装,新建一个SourceProfile继承自Profile:
1 public SourceProfile()
2 {
3 base.CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => {
4 q.MapFrom(z => z.Content);
5 });
6 }
所有映射关系都可以写在这一个类里,只需要在程序初始化的时候调用一次就可以了:
1 Mapper.Initialize(x => { x.AddProfile<SourceProfile>(); });
博主使用的AutoMapper版本6.1.1.0,因为AutoMapper在6.0版本时移除了Profile中的Configure,所以与6.0版本以下写法有点不同,6.0以下版本写法为:

1 public class SourceProfile : Profile
2 {
3 protected override void Configure()
4 {
5 CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => {
6 q.MapFrom(z => z.Content);
7 });
8 }
9 }

继承Profile重写其Configure即可,调用方式与上述没有太大差别。 Mapper.Initialize中可添加一个或多个Profile。
在MVC项目的应用中,可以将Mapper.Initialize封装到一个类里;

public static class AutoMapperForMvc
{
public static void Register()
{
Mapper.Initialize(x => {
x.AddProfile<SourceProfile>();
});
} }

进而在MVC的Global中进一次性注册:

1 public class MvcApplication : System.Web.HttpApplication
2 {
3 protected void Application_Start()
4 {
5 AreaRegistration.RegisterAllAreas();
6 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
7 RouteConfig.RegisterRoutes(RouteTable.Routes);
8 BundleConfig.RegisterBundles(BundleTable.Bundles);
9 //注册
10 AutoMapperForMvc.Register();
11 }
12 }

转载 AutoMapper在C#中的有趣应用 https://www.cnblogs.com/lvlinlv/p/7344916.html的更多相关文章
- AutoMapper在C#中的有趣应用
最近发现了一个比较有趣的东西 AutoMapper,主要将Model转换为DTO,DTO更注重数据,对领域对象进行合理封装,从而不会将领域对象的行为过分暴露给表现层. 先来看一点实例,两个类之间的映射 ...
- 转载 1-EasyNetQ介绍(黄亮翻译) https://www.cnblogs.com/HuangLiang/p/7105659.html
EasyNetQ 是一个容易使用,坚固的,针对RabbitMQ的 .NET API. 假如你尽可能快的想去安装和运行RabbitMQ,请去看入门指南.EasyNetQ是为了提供一个尽可能简洁的适用与R ...
- 【转载】C/C++中extern关键字详解
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...
- [转载]在Vmware ESXI中安装群晖Synology DSM 5.0 (4528)
转载 在Vmware ESXI中安装群晖Synology DSM 5.0 (4528) 文件准备 Vmware ESXi用户安装需要的文件 NB_x64_5032_DSM_50-4528_Xpenol ...
- 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求【转载】
标签:C# HTTPS HttpWebRequest HTTP HttpWebResponse 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. ...
- 转载:浅析Java中的final关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...
- 【转载】SQL语句中Union和Union All的区别
在使用到SQL语句进行数据库查询的过程中,如果需要求两个数据集合的并集,一般会使用到联合查询关键字Union或者Union All,其实Union和Union All两者的使用有一定差别,查出来的数据 ...
- 【转载】ASP.NET中Server.MapPath方法获取网站根目录总结
在ASP.NET网站应用程序中,可以通过Server.MapPath方法来获取跟服务器有关的目录信息,如获取网站的根目录.获取当前代码文件所在的目录路径.获取当前代码所在路径的上级路径等.Server ...
- 【转载】Asp.Net中使用基于jQuery的javascript前台模版引擎JTemplate
JTemplate是基于jQuery的开源的前端模版引擎,在Jtemplate模板中可以使用if判断.foreach循环.for循环等操作,使用Jtemplate模板优点在于ajax局部刷新界面时候不 ...
随机推荐
- [转]Oracle密码过期, 报:ORA-01017: 用户名/口令无效; 登录被拒绝
本文转自:https://blog.csdn.net/jeff06143132/article/details/25696371 连接Oracle,以Oracle用户登陆: $su - oracl ...
- eclipse + maven搭建SSM框架
0.系统环境 1)Windows 10 企业版 2)JDK 1.8.0_131 3)Eclipse Java EE IDE for Web Developers Version: Neon.3 Re ...
- ASP.NET Identity 二 (转载)
来源:http://www.cnblogs.com/r01cn/p/5180892.html#undefined 推荐看原文,这里转载是怕好文章消失了. 注:本文是[ASP.NET Identity系 ...
- [javaEE] HTTP协议总结
OSI网络7层协议 物理层 ==> 数据链路层 ==> 网络层ip ==> 传输层 TCP UDP ==>会话层 ==>表示层 ==> 应用层 HTTP FTP S ...
- char和string的不同点
'a'是char, "a"是char string,这两者都是普通的字符和字符串,和C中没什么不同 值得注意的是后者包含两个字符,末尾有一个隐身的'\0' 而:string str ...
- System.arraycopy 怎么使用的?
前言:看 ArrayList 的源码,发现 remove 方法主要依赖了 System.arraycopy() 方法实现的.所以需要了解一下这个方法如何使用.转载请注明出处:https://www.c ...
- JavaScript中的window对象的属性和方法;JavaScript中如何选取文档元素
一.window对象的属性和方法 ①setTimeout()方法用来实现一个函数在指定毫秒之后运行,该方法返回一个值,这个值可以传递给clearTimeout()用于取消这个函数的执行. ②setIn ...
- js之搜索框
目标效果:点击搜索框,搜索框内提示信息消失,可输入搜索信息,点击搜索框外搜索框如果没提示信息或者为空时,显示搜索框提示信息,如果有搜索信息,显示搜索信息. 代码如下: <!DOCTYPE htm ...
- 【20181025】win10下Python安装osmnx包
系统:win10 64位 Python:3.7 在网上查了很多资料,主要有两种方法安装osmnx包,一种是通过anaconda安装,这种方法会自动帮你装好osmnx的依赖包:另一种是用pip安装,需要 ...
- CSS--选择符大全(常用css选择符)
(一)元素选择符 E(某个元素,如p) id(使用id,如#idName) class(使用class,如.myclass) 通配符:* (二)关系选择符 包含选择符:E F(E所有的F包含子代,孙代 ...