Github 开源:使用升讯威 Mapper( Sheng.Mapper)与 AutoMapper 互补,大幅提高开发效率!
| Github 地址:https://github.com/iccb1013/Sheng.Mapper |
在上一篇幅中,简单介绍了 升讯威 Mapper( Sheng.Mapper)【http://www.cnblogs.com/sheng_chao/p/7026732.html】,上文的介绍比较粗略,在这篇文章中,直接用几个例子来具体的讲一下它的使用场景,和为什么要使用它,以及和 AutoMapper 的互补使用。
AutoMapper 是一款十分强大的对象映射工具,我在项目中大量的使用了 AutoMapper 这一工具,如处理 DTO 与 实体对象间的映射关系,使用类似如下代码:

但是在使用 AutoMapper 的过程中,有一些小细节会比较麻烦,它不能创建相同对象类型间的映射赋值关系,也不能根据场景为相同的对象映射关系创建不同的映射逻辑,所以我们目前的使用集中的 Dto 与 实体对象间的映射。
我们现在的项目使用了 Entity Framework ,在更新数据时,一般的逻辑是前端传过来一个 DTO 对象,转换成实体对象,根据 Id 去 DBContext 中拿到数据库中的实体对象,再用传入的实体对象给数据库中的对象赋值,SaveChanges。
类似如下代码,用传入的 storehouseBase 给 dbStorehouseBase 赋值:

这里如果使用 AutoMapper 就涉及到两个问题:
1.AutoMapper 是不能为相同的对象类型创建映射规则的,如:

2.如果不使用规则,即使可以直接 Map,实体对象中又存在大量的导航属性,是不能直接覆盖过去的,这就比较麻烦了,我们的项目中开发人员只好手工的用传入的实体对象,一个属性一个属性为数据库中拿到的实体对象赋值,如果要更新的属性比较多,就非常麻烦,此外在修改时给实体对象新增加了属性,是否还能保证记得回到这里来给添加新的赋值代码。
所以在这种场景下, 可以使用 ShengMapper 来解决:

ShengMapper 的 SetValuesSkipVirtual 方法,见文知义,它自动映射两个对象,进行赋值操作,并自动的跳过 Virtual 属性,因为 Entity Framework 的导航属性都是 Virtual 的(DB First)。
此外,还有一些更新赋值场景,存在一些特定的业务逻辑,比如说我更新用户时,不更新 Password 字段,不更新最后登录时间字段,更新订单时,不更新创建时间字段等等,这种同一种对象类型的映射赋值,不但要跳过导航属性,还要跳过指定的字段,也可以使用 ShengMapper 很好的解决,使用类似如下代码:

它的方法原型是:

SetValuesWithoutProperties 方法 把 product 中的属性,更新到 dbProduct 中,同时跳过 Supplier 属性和所有的 Virtual 属性。
那么既然能跳过指定的属性,自然我们也能只更新指定的属性,如:

SetValuesWithProperties 方法把 productEntryBatch 中的属性值更新到 dbProductEntryBatch 中,但是只更新 Name 这个属性。
ShengMapper 还提供了一些其它方法重载:

使用 ShengMapper 是不需要事先创建规则的,所有对对象的映射赋值操作,都是以更灵活的方式来完成的,比如我这一次 User 对 User 要排除 Password ,另一个场景不需要排除,也是可以的,而 AutoMapper 的规则必须是全局唯一的,一旦创建了 UserDTO 对 User 的规则,在所有的时候,都会遵循事先定义的规则去执行。
所以在实际应用中,可以通过与 AutoMapper 互补的方式,解决这方面的问题。
欢迎交流探讨:QQ:279060597 @南京
Github 开源:使用升讯威 Mapper( Sheng.Mapper)与 AutoMapper 互补,大幅提高开发效率!的更多相关文章
- GitHub开源:升讯威微信营销系统(第三方微信平台)完整源代码
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction 升讯威微信营销系统开发实践系列升讯威微信营销系统开发实践:(1)功能设计与架构设 ...
- Github 开源:升讯威 Winform 开源控件库( Sheng.Winform.Controls)
Github 地址:https://github.com/iccb1013/Sheng.Winform.Controls 本控件库中的代码大约写于10年前(2007年左右),难免有不成熟与欠考虑之处, ...
- GitHub开源:升讯威ADO.NET增强组件 sheng.ADO.NET.Plus V1.3
GitHub: https://github.com/iccb1013/sheng.ADO.NET.Plus 早前分享过,当时没有把代码上传到Github,只是通过邮件的形式分享给了部分需要的朋友,最 ...
- GitHub开源:升讯威 SQLite 增强组件 Sheng.SQLite.Plus
Github:https://github.com/iccb1013/Sheng.SQLite.Plus Sheng.SQLite.Plus 是一个对直接使用 ADO.NET 方式操作 SQLite ...
- 详解升讯威在线客服系统前端 JavaScript 脚本加密技术(1)
我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户.对我来说,只要能获得用户的认可,就是我最大的动力. 这段时间有几个技术小伙伴问了我一个有意思的问题:"你的前端脚本是 ...
- 升讯威微信营销系统开发实践:(4)源代码结构说明 与 安装部署说明( 完整开源于 Github)
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...
- 升讯威微信营销系统开发实践:(3)功能介绍与此项目推广过程的一些体会( 完整开源于 Github)
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...
- 升讯威微信营销系统开发实践:所见即所得的微官网( 完整开源于 Github)
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...
- 升讯威微信营销系统开发实践:(2)中控服务器的详细设计( 完整开源于 Github)
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...
随机推荐
- 【CC2530入门教程-06】CC2530的ADC工作原理与应用
第6课 CC2530的ADC工作原理与应用 广东职业技术学院 欧浩源 一.A/D转换的基本工作原理 将时间上连续变化的模拟量转化为脉冲有无的数字量,这一过程就叫做数字化,实现数字化的关键设备是AD ...
- 一只猿:使用flask来做一个小应用
上周 @萍姐 问我如何抓取天猫上面店铺的评分,看了下挺简单的,于是花了点时间写了个Python脚本,加上web.py做成一个web服务,使用起来还不错,今天来看的时候发现当时为了方便直接用web.py ...
- Python数据分析之路(一)查询和统计
0. 如何入门数据分析 关注沙漠之鹰的同学一定看过沙漠君写得很多篇数据分析文章,比如分析房价,车价,预测机动车摇号这些话题.其实文章中所有的分析都使用了Python和它非常强大的数据分析库Pandas ...
- React环境配置
现在开始配置一个基础项目. 创建项目文件夹:C:\Users\Danny\Desktop\React npm init 创建package.json文件 下面的所有安装,都是--save-dev,因为 ...
- 【干货】Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔)
写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所有涉及到的大部分代码均在这个demo里面:https://github ...
- Mysql连接出错问题
1.java 提示:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 处理:导入mysql-connector-java-5.1.7-bi ...
- 详解equals()方法和hashCode()方法
前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.equals()和hashCode()都不是final方 ...
- CJOJ 2482 【POI2000】促销活动
CJOJ 2482 [POI2000]促销活动(STL优先队列,大根堆,小根堆) Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用 ...
- Spring Boot 1.5.4集成Redis
本文示例源码,请看这里: 如何安装与配置Redis,请看这里 首先添加起步依赖: <dependency> <groupId>org.springframework.boot& ...
- 【Java IO流】File类的使用
File类的使用 Java中的File类是在java.io.File中,Java.IO.File类表示文件或目录. File类只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问. 一 ...