经过上一篇博客的学习,大体了解了Auto Mapper的运行机制和操作流程。我们下来学习下,AutoMapper里面具体的一些东西。

一:规则

当我们使用AutoMapper创建实体和外部Model的映射的时候,AutoMapper的匹配原值有三种方式。

#:名称相同的属性进行映射,不区分大小写。

#:带Get前缀的方法进行映射。<例子(Order和OrderDto):Order中的GetTotal分割成Get和Total,Total会和Dto中的进行匹配。>

#:目标类型属性分割。<CustomerName也是一样,是分割的,Name回合后面的匹配。>

Order类

    /// <summary>
/// 订单
/// </summary>
public class Order
{
public Customer Customer { get; set; } public decimal GetTotal()
{
return 10*10;
}
}
/// <summary>
/// 顾客
/// </summary>
public class Customer
{
public string Name { get; set; }
}

OrderDto类

    /// <summary>
/// 数据传输对象Dto
/// </summary>
public class OrderDto
{
public string CustomerName { get; set; }
public decimal Total { get; set; }
}

这里我们将Order转换为OrderDto,也就是Order里面的Customer中的Name转换为CustomerName;

            Order dto=new Order()
{
Customer = new Customer{Name = "ahui"},
};
//配置
Mapper.CreateMap<Order, OrderDto>();
//执行
var order = Mapper.Map<Order,OrderDto>(dto);
Console.WriteLine(order.CustomerName);
Console.ReadKey();

二:AutoMapper中利用Condition来进行判断,从而选择是否进行转换。

订单

    /// <summary>
/// 订单
/// </summary>
public class Order
{
public Order()
{
Number = 100;
}
//订单数量
public int Number { get; set; }
}

订单DTO

    /// <summary>
/// 数据传输对象Dto
/// </summary>
public class OrderDto
{
public OrderDto()
{
Num = 90;
}
public int Num { get; set; }
}

Main()方法

            //配置   通过Condition来规定Order中的值是0~12之间。在这个之间就可以进行映射,不是就不映射。输出其默认值10;
Mapper.CreateMap<Order,OrderDto>().ForMember(x=>x.Num,mo=>mo.Condition(s=>s.Number >0&& s.Number <12)).ForMember(x=>x.Num,mo=>mo.MapFrom(x=>x.Number));
//执行映射
var orderDto = Mapper.Map<OrderDto>(new Order(){Number = 10});
var p1 = Mapper.Map<OrderDto>(new Order(){Number = 20});
Console.WriteLine(orderDto.Num); //这里输出10
Console.WriteLine(p1.Num); //这里转换失败,结果为90.
Console.ReadKey();

通过Condition这个方法我们可以规定如何去转换,指定转换条件。

三:通过Initialize来增加一个配置文件。

这里增加一个配置文件,主要是防止我们以后配置文件多了,我们不必每一次都写,在需要调用配置文件即可。

1:新建一个ProFilesMapper类继承自Profile,并且实现他的方法Configuer(),这个方法就是我们在里面写配置文件的。

    /// <summary>
/// 配置文件
/// </summary>
public class ProFilesMapper:Profile
{
protected override void Configure()
{
//这里放一些CreateMap(),也就是我们之前的配置映射
//配置 通过Condition来规定Order中的值是0~12之间。在这个之间就可以进行映射,不是就不映射。输出其默认值10;
Mapper.CreateMap<Order, OrderDto>().ForMember(x => x.Num, mo => mo.Condition(s => s.Number > 0 && s.Number < 12)).ForMember(x => x.Num, mo => mo.MapFrom(x => x.Number));
}
}

2:在main()方法里面可以直接使用加载配置文件就可以实现之前的的配置了。

            //配置
Mapper.Initialize(x =>x.AddProfile<ProFilesMapper>());

这样就可以实现配置了。

            //配置
Mapper.Initialize(x =>x.AddProfile<ProFilesMapper>());
//执行映射
var orderDto = Mapper.Map<OrderDto>(new Order() { Number = 10 });
var p1 = Mapper.Map<OrderDto>(new Order() { Number = 20 });
Console.WriteLine(orderDto.Num); //这里输出10
Console.WriteLine(p1.Num); //这里转换失败,结果为90.
Console.ReadKey();

四:实现命名惯例

只需要配置中添加下面两句代码
        protected override void Configure()
{
//这里放一些CreateMap(),也就是我们之前的配置映射
//配置 通过Condition来规定Order中的值是0~12之间。在这个之间就可以进行映射,不是就不映射。输出其默认值10;
Mapper.CreateMap<Order, OrderDto>().ForMember(x => x.Num, mo => mo.Condition(s => s.Number > 0 && s.Number < 12)).ForMember(x => x.Num, mo => mo.MapFrom(x => x.Number)); //通过下面的两个设置源和目标的命名惯例 而且必须写在CreateMap后面
SourceMemberNamingConvention=new LowerUnderscoreNamingConvention();
DestinationMemberNamingConvention=new PascalCaseNamingConvention();
}
            //配置
Mapper.Initialize(x=>x.AddProfile<ProFilesMapper>());
//执行映射
var d1 = Mapper.Map<OrderDto>(new Order()
{
MyName ="ahui"
});
Console.WriteLine(d1.my_name);
Console.ReadKey();

看下我们的两个属性

        public string my_name { get; set; }
        public string MyName { get; set; }

这个我觉得就是像忽略了大小写,直接就可以进行映射。

五:集合之间的映射

这里就是在我们Mapper.Map<>(),执行映射的时候,这里我们看他们需要什么类型的,就传递什么。

配置:

            Mapper.CreateMap<Souce,Destination>();

类代码:

    public class Souce
{
public int Value { get; set; }
} public class Destination
{
public int Value { get; set; }
}

main()方法:

            #region 示例08
//配置
Mapper.Initialize(x=>x.AddProfile<ProFilesMapper>());
//初始化,这就是将其初始化为数组
var sources = new[]
{
new Souce(){Value = 1},
new Souce(){Value = 2},
new Souce(){Value = 3},
};
//执行映射
IEnumerable<Destination> iEnumerabledDestinations = Mapper.Map<IEnumerable<Destination>>(sources); ICollection<Destination> iCollectionDestinations = Mapper.Map<ICollection<Destination>>(sources); IList<Destination> iListDest = Mapper.Map<IList<Destination>>(sources); List<Destination> listDests =
Mapper.Map<List<Destination>>(sources); Destination[] deatArrey =
Mapper.Map<Destination[]>(sources); Console.WriteLine("******第一个转换*****");
foreach (var item in iEnumerabledDestinations)
{
Console.WriteLine(item.Value + ",,");
}
Console.WriteLine("******第二个转换*****");
foreach (var item in iCollectionDestinations)
{
Console.WriteLine(item.Value + ",,");
}
Console.WriteLine("******第三个转换*****");
foreach (var item in iListDest)
{
Console.WriteLine(item.Value + ",,");
}
Console.WriteLine("******第四个转换*****");
foreach (var item in deatArrey)
{
Console.WriteLine(item.Value + ",,");
}
Console.ReadKey();

我们通过这四种类型的执行映射都可以得到我们想要的结果,说明AutoMapper是成功的。

附件:

“tkb至简” http://www.cnblogs.com/farb/p/4932692.html

Auto Mapper03的更多相关文章

  1. C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)

    #include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...

  2. overflow:hidden与margin:0 auto之间的冲突

    相对于父容器水平居中的代码margin:0 auto与overflow:hidden之间存在冲突.当这两个属性同时应用在一个DIV上时,在chrome浏览器中将无法居中.至于为啥我也不明白.

  3. Android Auto开发之一《开始学习Auto 》

    共同学习,共同进步, 转载请注明出处.欢迎微信交流:sfssqs,申请注明"Android Car"字样 ================= =================== ...

  4. width:100%;与width:auto;的区别

    <div> <p>1111</p> </div> div{ width:980px; background-color: #ccc; height:30 ...

  5. SQl 2005 For XMl 简单查询(Raw,Auto,Path模式)(1)

    很多人对Xpath可能比较熟悉,但不知道有没有直接操作过数据库,我们都知道 在Sql2005里公支持的几种查询有Raw,Auto模式,页并没有Path和Elements用法等,如果在2000里使用过 ...

  6. margin:0 auto;不居中

    margin:0 auto:不居中可能有以下两个的原因; 1.没有设置宽度<div style="margin:0 auto;"></div>看看上面的代码 ...

  7. 初学C++ 之 auto关键字(IDE:VS2013)

    /*使用auto关键字,需要先赋初值,auto关键字是会根据初值来判断类型*/ auto i = ; auto j = ; cout << "auto i = 5" & ...

  8. C++11 - 类型推导auto关键字

    在C++11中,auto关键字被作为类型自动类型推导关键字 (1)基本用法 C++98:类型 变量名 = 初值;   int i = 10; C++11:auto 变量名 = 初值;  auto i ...

  9. 为什么 "auto a = 1;" 在C语言中可以编译通过?

    参照:这里 这让我想起之前看的一部书, int i; 其实是等价与 auto int i; 表示为局部变量 这应该与static是相对的吧?

随机推荐

  1. Backbone源码解析(五):Route和History(路由)模块

    今天是四月十二号,距离上次写博已经将近二十天了.一直忙于工作,回家被看书的时间占用了.连续两个礼拜被频繁的足球篮球以及各种体育运动弄的精疲力竭,所以很少抽时间来写技术博客.今天抽出时间把backbon ...

  2. Ehcache BigMemory: 摆脱GC困扰

    问题 使用java开源项目经常需要调优jvm,以优化gc.对于gc,如果对象都是短时对象,那么jvm相对容易优化,假如碰上像solr使用自带java cache的项目,那么gc严重受限于cache,因 ...

  3. 【转载】关于sql server 代理(已禁用代理xp)

    原文地址:http://blog.sina.com.cn/s/blog_493cafbb0100qy91.html 症状: SQL SERVER2005里面,启动SQL代理服务,启动正常,但是在sql ...

  4. [HIMCM暑期班]第1课:概述

    作为这个系列的开始,我会把每一节课上过的内容,与同学们互动后发现他们的闪光点记录下来,以后其他要准备该比赛的人借鉴和参考. 第一节课是概述,主要讲什么是数学建模,还有建模可以帮助我们做什么.举了三个例 ...

  5. GDT,LDT,GDTR,LDTR 详解,包你理解透彻(转)

    引自:http://www.techbulo.com/708.html 一.引入 保护模式下的段寄存器 由 16位的选择器 与 64位的段描述符寄存器 构成 段描述符寄存器: 存储段描述符 选择器:存 ...

  6. 如何在 Ubuntu 15.04 上安装带 JSON 支持的 SQLite 3.9

    欢迎阅读我们关于SQLite 的文章,SQLite 是当今世界上使用最广泛的 SQL 数据库引擎,它基本不需要配置,不需要设置或管理就可以运行.SQLite 是一个是公开领域(public-domai ...

  7. MVVM架构~knockoutjs系列之扩展ajax验证~验证输入数据是否与后台数据相等

    返回目录 在看这篇文章之前,你有必要先看我之前的文章,之前文章是将一个方法以参数的形式传给KO,然后返回一个真假值,去做验证,这类似于面向对象语言里的委托,在JS里我们叫它回调方法,本篇文章与前一文章 ...

  8. EF架构~引入规约(Specification)模式,让程序扩展性更强

    回到目录 规约(Specification)模式:第一次看到这东西是在microsoft NLayer项目中,它是微软对DDD的解说,就像petshop告诉了我们MVC如何使用一样,这个规约模式最重要 ...

  9. Android开发学习之路-SimpleAdapter源码分析学习

    今天在课堂上,老师用到了SimpleAdapter,然后女神在边上问我为什么这个SimpleAdapter不能做到我app那种带有进度条的效果,言语说不清,然后就开始看源代码,发现这个Adapter的 ...

  10. LLBL Gen Template Studio 2.x

    Template Studio for LLBLGen Pro released Today we released Template Studio, a full-featured IDE for ...