Emit学习(4) - Dapper解析之数据对象映射(二)
承接着上一篇, 这一篇主要以堆栈的方式来演示一下, db数据转换到类中去的一个过程.
一、先看第一张图
程序在运行到176行(上一篇贴出的代码)的时候, 就会出现上图中的第一个栈.
那在此之前, Dapper又做了些什么呢? 抛开Dapper的这种OpCodes的实现方式来说, 我们自己用代码去转换, 实现思路如下:
1. 首先肯定是要获取, 从db读取出来的那么多列中, 有哪一些是需要转换的吧, 如果是select * , 那会读取出所有的列, 但是我本身并不需要那么多列, 而且, 我接收的类, 本身可能并没有那么多的列, 所以, 首先确定有哪些列需要转换, 以及这些列从db中读取出来是什么类型的.
2. 当确定好有效的列之后, 就可以获取类中的构造函数, 已备创建类的时候使用. 在获取构造函数的时候, 当然是越简单的构造函数越好.(Dapper中会优先检测标有ExplicitConstructor属性的构造函数, 然后获取构造函数的参数, 然后初始化参数), 然后就是把这个类new出来.
3. 到现在, 我们其实就已经能知道source data type 和 target property/feild type了, 既然已经两边的类型都已经知道, db数据已经准备好, target class也已经new好了, 就可以来实现转换了, 根据类型的不同, 来使用不同的转换. 值得一提的事, 如果 target class中, 含有自定义类的属性或者字段, Dapper是不会继续转换的, 直接给了个null就了事了. 其实Dapper中, 也是可以实现此功能的, 这部分以后再说.
那么现在回到Dapper里来, 其实他做的工作也是这样子的, 顺序可能稍有不同, 1,2的顺序是可调的. 只是他实现的方式稍有不同而已. 条条大路通罗马, 目的地都是相同的, 不同的是途中的风景.
二、接着第二张图
上图中的第一个栈, 是执行完 181行 代码之后, 出现的情况, 180行, 181代码的意思, 其实就是把 reader[index]复制一份到 loc2中, 这个loc2就是前面(161行)声明的, 类型为object的本地变量, 所以, 从堆栈的情况来看, 180行未执行前, 和181行执行完之后的堆栈是一样的. 所以我就不画了.
在执行Unbox_Any之前, 是已经知道source type和target type了, 并且已经经过判断, 是否能够转换, 然后再通过Unbox_Any来转, Unbox是拆箱操作, Unbox_Any是拆箱成你需要的类型
上面这两幅图就是正常情况下(int, string, datetime, double等)的堆栈变化过程了, 应该还是比较能辅助理解的了.
Emit学习(4) - Dapper解析之数据对象映射(二)的更多相关文章
- Emit学习(4) - Dapper解析之数据对象映射(一)
感觉好久没有写博客了, 这几天有点小忙, 接下来会更忙, 索性就先写一篇吧. 后面估计会有更长的一段时间不会更新博客了. 废话不多说, 先上菜. 一.示例 1. 先建类, 类的名称与读取的表名并没有什 ...
- php设计模式 数据对象映射模式
数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作. 在代码中实现数据对象映射模式,实现一个ORM类,将复杂的sql语句映射成对象属性的操作.对象关系映射(Obje ...
- PHP 设计模式 笔记与总结(10)数据对象映射模式 2
[例2]数据对象映射模式结合[工厂模式]和[注册模式]的使用. 入口文件 index.php: <?php define('BASEDIR',__DIR__); //定义根目录常量 includ ...
- PHP 设计模式 笔记与总结(9)数据对象映射模式
[数据对象映射模式] 是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作.例如在代码中 new 一个对象,使用数据对象映射模式就可以将对象的一些操作比如设置一些属性,就会自动保存到数 ...
- PHP设计模式笔记六:数据对象映射模式 -- Rango韩老师 http://www.imooc.com/learn/236
数据对象映射模式 1.数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作 2.在代码中实现数据对象映射模式,我们将实现一个ORM类,将复杂的SQL语句映射成对象属性 ...
- Java创建和解析Json数据方法(二)——org.json包的使用
(二)org.json包的使用 1.简介 工具包org.json.jar,是一个轻量级的,JAVA下的json构造和解析工具包,它还包含JSON与XML, HTTP headers, Cookie ...
- ASP.NET MVC 模型和数据对象映射实践
在使用 MVC 开发项目的过程中遇到了个问题,就是模型和数据实体之间的如何快捷的转换?是不是可以像 Entity Framework 的那样 EntityTypeConfiguration,或者只需要 ...
- .NetCore学习笔记:四、AutoMapper对象映射
什么是AutoMapper?AutoMapper是一个简单的小型库,用于解决一个看似复杂的问题 - 摆脱将一个对象映射到另一个对象的代码.这种类型的代码是相当沉闷和无聊的写,所以为什么不发明一个工具来 ...
- Python学习笔记_Chapter 6定制数据对象
1. 有用的BIF a. 判断字符串中是否包含子字符串 if s_a in s_b: b. pop() 描述:从指定的列表位置删除并返回一个数据项. (sarah_name,sarah_dob)=l_ ...
随机推荐
- JDBC学习1:详解JDBC使用
什么是JDBC JDBC(Java Database Connectivity),即Java数据库连接,是一种用于执行SQL语句的Java API,可以为多种关系数据库提供同一访问,它由一组用Java ...
- 【css3】--四种气泡
在聊天的场景中,聊天内容需要用到气泡修饰,如下图.下面一一讲解. 图片式: 第一个样式是京东客服,气泡的圆角和钩子都是用了图片.使用了一个table组合成了一个圆角的框框.lm样式拼出了钩子. < ...
- [ACM_动态规划] 嵌套矩形
问题描述:有n个矩阵,每个矩阵可以用两个整数a,b来表示 ,表示他的长和宽,矩阵X (a,b) 可以 嵌套 到Y (c,d) 里面当且仅当 a < c && b < d ...
- js数组转json
function arrayToJson(o) { var r = []; if (typeof o == "string") return "\"" ...
- 《OOC》笔记(4)——自动化地将C#代码转化为C代码(结构版)
<OOC>笔记(4)——自动化地将C#代码转化为C代码(结构版) 我在<C表达面向对象语言的机制——C#版>中已经说明了从C#到C的转换方法.这次看<OOC>也是想 ...
- underscore源码阅读记录
这几天有大神推荐读underscore源码,趁着项目测试的空白时间,看了一下. 整个underscore包括了常用的工具函数,下面以1.3.3源码为例分析一下. _.size = function(o ...
- 浅谈敏捷组织中PMO的人物
所谓的"敏捷组织"其实并没有标准的形式,而且PMO(项目办理单位)并没有一个标准的人物界说.有一个十分遍及的误解,公司在挑选"灵敏"或许"瀑布&quo ...
- fir.im Weekly - 当技术成为一种 “武器”
最近纷纷扰扰,快播公开庭审,携程事件仍在升级,百度还在继续无底线.我们相信技术本身并不可耻,但是用技术作恶就是可耻.当技术成为一种武器,Do not be evil. 好了,继续本期的 fir.im ...
- 过滤器中的chain.doFilter(request,response)
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml文件配置好要 ...
- android 股票数据通过日K获取周K的数据 算法 源码
目前的数据是从新浪接口获取的, http://biz.finance.sina.com.cn/stock/flash_hq/kline_data.php?symbol=sh600000&end ...