转载 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局部刷新界面时候不 ...
随机推荐
- c#cookie读取写入操作
public static void SetCookie(string cname, string value, int effective) { HttpCookie cookie = new Ht ...
- appendChild简单表格的增删改查
---恢复内容开始--- <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><hea ...
- 一款非常好用的万能本地离线激活工具,支持Office2016、Office2015、Win7、Win8/8.1/10、Win2008/2012/R2系统,全自动安装且无需联网状态即可全部激活,它由国外网友heldigard制作,小巧、简单,只需运行而不用去管它自动激活,能自动激活为180天无限循环,欢迎大家下载使用
office2016激活工具(KMS)是一款非常好用的万能本地离线激活工具,支持Office2016.Office2015.Win7.Win8/8.1/10.Win2008/2012/R2系统,全自动 ...
- Windows环境使用Nexus-3.x搭建Maven私服
[前言] 本文主要讲解在Wiindows环境下搭建最新出的Nexus 3.x私服. 1.搭建私服的必要性 一般情况下,各个公司的开发团队为了提高开发效率,都会使用项目构建工具进行开发.常见的构建工具有 ...
- Java学习第一篇 — 字符串
package StringTest; public class TestString { public static void main(String[] args){ // String str= ...
- fast-spring-boot快速开发项目
Introduction fast-spring-boot 集成Spring Boot 2.1,Mybatis,Mybatis Plus,Druid,FastJson,Redis,Rabbit MQ, ...
- 移动端meta整理
<!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...
- js之返回网页顶部
目标效果:浏览网页过程中,滑动滚轮,显示返回顶部按钮,点击返回顶部后,返回网页顶端. 代码如下: <!DOCTYPE html> <html lang="en"& ...
- 聊聊setTimeout和setInterval线程
在聊setTimeout和setInterval这两个事件的前,先聊另外一个与之密切关联的知识点,那就是线程(thread).而线程有常常跟另外一个词语--“进程”一起出现.那么何为线程?何为线程呢? ...
- 山西WebGIS项目总结
有一段时间没写blog了,说实话,最近的心态一直在变化,看了一部日剧,回想了这一年所学所见,感觉生活目标变了. 做国土项目这段时间不是很忙,由于数据一直给不到位,时间拖得很久,所以在这期间也在继续学习 ...