本篇AutoMapper使用场景:

※ 源字典集合转换成目标字典集合

※ 枚举映射

※ 自定义解析器

※ 源中的复杂属性和Get...方法转换成目标属性

源字典集合转换成目标字典集合

□ Domain model

public class SourceValue

{

public int Value { get; set; }

}

□ View model

public class DestValue

{

public int Value { get; set; }

}

□ 映射配置

Mapper.CreateMap<SourceValue, DestValue>();

□ 使用

public ActionResult Dic()

{

var sourceDict = new Dictionary<string, SourceValue>

{

{"First", new SourceValue(){Value = 5}},

{"Second",new SourceValue(){Value = 10}}

};

var destDict = Mapper.Map<Dictionary<string, SourceValue>, IDictionary<String, DestValue>>(sourceDict);

return View((destDict));

}

枚举映射

public enum OrderStatus : short

{

InProgress = 0,

Complete = 1

}

public enum OrderStatusDto

{

InProgress = 0,

Complete = 1

}

□ 使用

//例子1

public ActionResult Meiju()

{

var dest = Mapper.Map<OrderStatus, OrderStatusDto>(OrderStatus.InProgress);

return View(dest);

}

//例子2

public ActionResult Meiju1()

{

var dest =

Mapper.Map<AttributeTargets, AttributeTargets>(AttributeTargets.Class | AttributeTargets.Interface);

return View(dest);

}

□ 要点

枚举映射不需要做映射配置。

自定义解析器

□ Domain model

public class Source1

{

public int Value { get; set; }

public int Value2 { get; set; }

}

□ View model

public class Destination1

{

public int Total { get; set; }

}

□ 自定义解析器,继承于ValueResolver<,>

public class CustomResolver : ValueResolver<Source1,int>

{

protected override int ResolveCore(Source1 source)

{

return source.Value + source.Value2;

}

}

□ 映射配置

Mapper.CreateMap<Source1, Destination1>()

.ForMember("Total", opt => opt.ResolveUsing<CustomResolver>());

□ 使用

public ActionResult Jiexi()

{

var source = new Source1()

{

Value = 5,

Value2 =  7

};

var dest = Mapper.Map<Source1, Destination1>(source);

return View(dest);

}

□ 要点

派生ValueResolver<,>实现自定义解析器,实现对源属性的"计算" 转换成目标属性。

源中的复杂属性和Get...方法转换成目标属性

□ Domain model

public class Order2

{

private readonly IList<OrderLineItem2> _orderLineItems = new List<OrderLineItem2>();

public Customer2 Customer { get; set; }

public OrderLineItem2[] GetOrderlineItems()

{

return _orderLineItems.ToArray();

}

public void AddOrderLineItem(Product2 product, int quantity)

{

_orderLineItems.Add(new OrderLineItem2(product, quantity));

}

public decimal GetTotal()

{

return _orderLineItems.Sum(li => li.GetTotal());

}

}

public class OrderLineItem2

{

public OrderLineItem2(Product2 product, int quantity)

{

Product = product;

Quantity = quantity;

}

public Product2 Product { get; set; }

public int Quantity { get; set; }

public decimal GetTotal()

{

return Quantity*Product.Price;

}

}

public class Customer2

{

public string Name { get; set; }

}

public class Product2

{

public string Name { get; set; }

public decimal Price { get; set; }

}

□ View model

public class Order2Dto

{

public string CustomerName { get; set; }

public decimal Total { get; set; }

}

□ 映射配置

Mapper.CreateMap<Order2, Order2Dto>();

□ 使用

public ActionResult Complex()

{

var customer = new Customer2()

{

Name = "Darren"

};

var order = new Order2()

{

Customer = customer

};

var product = new Product2()

{

Name = "bosco",

Price = 5.00m

};

order.AddOrderLineItem(product, 10);

Order2Dto dto = Mapper.Map<Order2, Order2Dto>(order);

return View(dto);

}

□ 要点

目标中的属性遵循惯例:

○ 源中复杂属性名+复杂属性对应类的属性,构成了目标属性

○ 源中Get...()方法转换成目标中的...属性

AutoMapper在MVC中的运用03-字典集合、枚举映射,自定义解析器的更多相关文章

  1. AutoMapper在MVC中的运用06-一次性定义映射、复杂类型属性映射

    本篇AutoMapper使用场景: ※ 当源和目标具有同名的复杂类型属性.集合类型属性,这2种属性对应的类间也需建立映射 ※ 一次性定义好源和目标的所有映射 ※ 一次性定义好源和目标的所有映射,目标中 ...

  2. AutoMapper在MVC中的运用小结

    配置.单元测试.AOP注入 Decimal转换成String类型 源数组转换成目标数组 源中的集合(数组)属性转换成目标中的集合(数组)属性 子类父类间的映射 源字典集合转换成目标字典集合 枚举映射 ...

  3. AutoMapper在MVC中的运用01-配置、使用、单元测试、举例

    MVC中,如果想在Domain Model和View Model之间建立映射,用AutoMapper是一个不错的选择.不仅如此,AutoMapper能在不同对象之间建立映射,比如string与int类 ...

  4. AutoMapper在MVC中的运用07-映射在订单场景的例子

    本文参考了Taswar Bhatti的博客,他写了<Instant AutoMapper>这本书.遗憾的是,这本电子版书在国内还买不到,也下载不到.也只能从他的有限几篇博文中来窥探一二了. ...

  5. AutoMapper在MVC中的运用04-string映射各种类型、一个属性映射多个属性等

    本篇AutoMapper使用场景: ※ 类型转换,源string类型分别转换成int, DateTime,Type ※ 源和目标都包含复杂类型属性 ※ 把源中的一个属性映射到目标中的多个属性 类型转换 ...

  6. AutoMapper在MVC中的运用05-映射中的忽略、处理null、多种映射转换

    本篇AutoMapper使用场景: ※ 动态实现接口方法或属性 ※ 目标中的属性如果比源多,可以忽略多出的属性 ※ 目标有virtual属性,可忽略 ※ 目标属性值为null的解决办法 ※ int转s ...

  7. AutoMapper在MVC中的运用02-Decimal转String、集合、子父类映射

    本篇AutoMapper使用场景: ※ Decimal转换成String类型 ※ 源数组转换成目标数组 ※ 源中的集合(数组)属性转换成目标中的集合(数组)属性 ※ 子类父类间的映射 Decimal转 ...

  8. MVC中System.InvalidOperationException: 传入字典的模型项的类型为“XXX”,但此字典需要类型“XXA”的模型项

    出现此类错误的一个原因是Controller传过去的Model和View中的Model不是同一个Model

  9. mvc 中合并两个list集合

    有时候,在进行查询操作的时候需要将从数据库中查询的两张表进行合并,成为一张表然后返回给前端.或者在原有的一张表基础上面加几个新的字段. 这个时候可以新建一个.class[model类],在这个新建的m ...

随机推荐

  1. Gitlab & Github

    windwos上Git的使用 软件下载地址:https://github.com/git-for-windows/git/releases/download/v2.15.1.windows.2/Git ...

  2. tomcat -> 简介&部署

    Tomcat 简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开 ...

  3. Ibatis.Net 输出SQL语句学习(七)

    一.IBatis.net输出SQL语句 输出IBatis.net生成的SQL语句,能够方便调试. 在MapperHelper类中添加GetSql方法: /// <summary> /// ...

  4. Caffe学习系列(17): blob

    对于blob.h文件. 先看成员变量.定义了6个保护的成员变量,包括前.后向传播的数据,新.旧形状数据(?), 数据个数及容量. 再看成员函数.包括构造函数(4个参数),reshape(改变blob形 ...

  5. CF1063A 【Oh Those Palindromes】

    考虑在一个部分串中加入字符使得最终构造的串回文子串最多的方案 考虑简单情况,对于只含一种元素的串,我们要插入其他元素 记原有元素为$a$,新加元素为$b$ 考虑$b$的最优插入位置 原串$aaaa.. ...

  6. TPCC-MySQL安装、使用及结果解读

    tpcc-mysql用于MySQL基准测试,percona基于TPC-C(下面简写成TPCC)衍生出来的产品.下面对tpcc-mysql进行安装然后使用,最后结果解读,安装very easy,let ...

  7. AngularJs(SPA)单页面SEO以及百度统计应用(下)

    苍苍之天不得久视,堂堂之地不得久履 当你小心翼翼的开启服务端渲染的同时,一个问题不得不注意,使用内存模式去保存渲染过的页面,这样服务断掉重启后,缓存也没有了,所以这里我们使用mongdodb进行本地化 ...

  8. 【军哥谈CI框架】之CI中集成百度UEditor

    Hello,各位亲,新的一周来临啦,很高兴这么快又跟大家伙见面!话说上一回,军哥带大家用JQuery写了一个城市级联菜单的例子 ,不知道亲们学会了多少,是否自己可以独立写出来了呢. 军哥很是期待大家学 ...

  9. 使用nginx统一代理dashboard,grafana,Prometheus二级目录访问

    k8s上的这些管理工具必不可少,可以统一在nginx下的二级目录下. ingress是好,但我们不方便使用内部域名,相信么...:) 一,prometheus改造 在prometheus的deploy ...

  10. 【LOJ】#2524. 「HAOI2018」反色游戏

    题解 如果一个联通块是一个树的话,方案数就一种,如果这个联通块还有别的边,那选了一条别的边就会把树上对应路径全部取反,所以方案数是\(2^{m - n + 1}\) 如果联通块数为\(c\)方案数为\ ...