最近找工作面试,问到一些过去的工作和项目经验。我把公司用到的ORM框架(LLBL Gen)拿出来谈一谈,说一下他的优势,对方却一直追问ORM的好处,性能方面的问题,让我有时候都不知道如何回答,产生了不小的压力。

坦白来说,自学生时代(2004)就对NHibernate的大名敬仰已久,也完整的学习过它的映射文件写法,数据读取方法,当时对复杂的Xml映射配置文件了熟于胸。那时,微软的Application Block还比较流行,这项技术演变为后来的Enterprise Library,在第二份工作,我可以参与技术选型时,毫不犹豫的选择了Enterprise Library。再配合一个实体代码生成工具,工作中的技术需求都可以应对。再接下来的一份工作,选择ORM数据访问,再应用一些熟悉的技术,一下子对整个MIS类型项目的开发设计有了更基础层面的理解。如果需要了解,请参考

Enterprise Solution 2.2 开发帮助文档集合

ORM到底有什么好处,以我的理解有以下三点

1  强类型的对象 界面和业务逻辑层以实体对象来作为传输格式,编译器在编译时就可以辅助帮忙检查类型错误,而不需要等到运行时。

2  借助于数据绑定技术,业务逻辑层与界面层完全分离。ASP.NET MVC现在是教导你强制分离,并且创建好了基础结构,只需要遵循它的开发模式,即可开发出界面与逻辑分离的程序。但在WinForm时代,我承认,在之前,我是用很原始的方式,在窗体加载(OnLoad)时把数据绑定到控件,在点击按钮执行动作时,再从控件读取数据,传到逻辑计算方法中。强类型配合数据绑定技术,在界面加载时,传递一个entity到界面中,在执行动作时,获取数据源中的entity,可以节省大量的代码。

3 可扩展性,可维护性增强。如果有数据库字段修改,因为传递的是entity对象,数据访问接口不需要做任何修改,而界面中只需要把相关的字段绑定到控件中即可。MIS类型的项目,表格或字段的增加与减少是常有的事,而需要做的就是重新生成一次实体定义代码,绑定字段到界面中,增加需要的计算逻辑即可。

因为ORM框架会自带一些基础的类型(元数据)和数据访问方法,因而还可以做出很多基础性的工作。举例如下:

1  插件式系统的功能管理。管理基础的模块和功能。

2  定义一套权限结构。用户管理,用户组别管理,模块权限,功能权限,具体的数据字段权限与业务绑定。

3  定义一套查询框架。MIS类型的系统,在系统提供基础查询的基础上,要让用户可以自定义查询。在这点上,只需要获取ORM的entity与数据库中的table映射关系,放到基础的查询表中,再依照此实体,反射它的属性成员供用户选取查询,最后生成一个查询表达式,运行时转化成SQL语句从数据库中读取数据。

4  定义一套报表框架。因为报表是经常会发生变化的。报表的布局,参数,数据来源,计算逻辑都会依照实际的需求产生一些变化。程序员需要将报表开发中,不会改变的地方独立出去,做成一个公共模块,供报表开发人员调用。这一块内容,我做到了将用户输入值与与报表参数动态绑定。

5 导航设计工具。MIS项目如果要满足用户自定义菜单,导航功能的需求,则需要实现一套菜单结构定义。存储的格式为Xml或是数据库,在运行时,依据定义生成界面中的菜单和导航,增加灵活性。

6 工作流绑定。因为强类型的entity,它的create,delete,update动作都可以通过读取元数据得知,包括属性值的变更,以反射的方式读取。可以截获特定的值改变事件,比如采购单批准(approved)这个值设为yes,激活工作流,自动生成一些数据通知或查询结果,发送到指定的负责人。

性能层面,ORM肯定不及原生的ADO.NET,映射转换从entity到table都需要消耗一定的时间。经过优化的ORM查询,性能损失不比ADO.NET慢很多,但是得到的好处是易于维护,以及因此而带来的一系列的技术提升,前提是你不仅仅把ORM拿来做数据访问,还研究它的元数据结构,与数据绑定技术的融合等技术。

四年以前开发MIS类型的项目,从创建数据表开始,再借助于代码生成器,生成实体和数据访问代码,再到逻辑层开发。在经历上一份工作之后,经过这几年的积累,我也做到了快速开发,不过这次的格调也高很多。用企业架构模式中的话来说,前一种是事务脚本(transaction script),后一种是领域模式(domain model)。

最后写两句话与大家共勉励:

1 适合完成项目的技术是最好的技术,一味追求技术更新会给项目带来风险。

2 当你在习惯于一种开发模式后,在有精力或是项目允许的情况下,可以考虑尝试另一种技术路线。

当你还在纠结于ORM的性能时,我已经远远的把你抛在脑后的更多相关文章

  1. 测试Data ORM的性能

    闲着无聊,测试了一下公司ORM的性能,和其它的ORM相比,该有的都有了,不该有的也勉强塞了进去,总体考虑是并发与扩展性问题,譬如读写分离,消息总线服务整合,缓存内置. 测试机是I7,16G内存,这里只 ...

  2. 还在纠结 Flux 或 Relay,或许 Redux 更适合你

    重磅消息,Redux 1.0 发布,终于可以放心用于生产环境了! 在这个端应用技术膨胀的时代,每天都有一大堆框架冒出,号称解决了 XYZ 等一系列牛 X 的问题,然后过一段时间就不被提起了.但开发的应 ...

  3. 还在纠结注册.com域名还是.cn域名?

    一.概念 .com域名,国际最广泛流行的通用域名格式.国际化公司都会注册. .com域名:当然也可以选择.net/.org以.com为结尾的国际域名. 例如表示工商企业的 .com. 同时还有 .ne ...

  4. 还在纠结学什么编程语言吗?Python可能会“教”你做人

    这几年为什么Python在中国就火起来了? Python这个东西国,大概是从2017年末开始,突然就火了起来的.此前,对于Python,乃至编程,绝大多数程度上都是专业人士的话题,在普通大众层面上起不 ...

  5. 阮一峰大神的快排?刚才还在纠结sort()的我!真是个小傻瓜

    看到这个标题之后 我毫不犹豫的点进去了 趁现在不忙我赶紧把代码写到了我的小本本上好好研究研究 (写的就不放进来了 有点丑) 研究了下  第一反应 明明能用sort()解决的 为什么非要写这么一大串 但 ...

  6. 对posintion属性的简单认识,对于还在纠结的同学们,有一定的帮助

      position的四个属性值: relative ,absolute ,fixed,static 下面分别讲述这四个属性,以简单代码表示 <div id="parent" ...

  7. Mego(1) - NET中主流ORM框架性能对比

    从刚刚开始接触ORM到现在已有超过八年时间,用过了不少ORM框架也了解了不少ORM框架,看过N种关于ORM框架的相关资料与评论,各种言论让人很难选择.在ORM的众多问题中最突出的问题是关于性能方面的问 ...

  8. 那些年,UI设计师还在手工标注和切图时走的弯路

    在我从事UI设计师这几年的工作中逐渐发现,最让人糟心的不是应付各种奇葩的需求,完成设计稿,而是交付.每次交付的设计稿和最后开发出来的产品总是让我心塞无比,很少最终产品和我的设计稿是完全一致的. UI设 ...

  9. 【网络文摘】Androidguy:当你的才华还无法撑起你的野心时,那么应该静下心来学习

    [序] 2013年12月初,接到51CTO的邀请写一篇关于挨踢人物传记的邀请.尽管写文章对我已不是什么新鲜事.数年来写的书和博客至少也在600万字以上.不过基本都是与技术有关的.写传记这还是头一次,也 ...

随机推荐

  1. ExtJs 3.0 动态生成 CheckBox

    在开发过程中,往往需要利用数据动态生成Checkbox.如权限节点.考试答案,调查选项等等.在Extjs中,有两种方法来获取后台数据,一是Ext.Ajax()方法,第二种是利用 Store,store ...

  2. 多进程模块multiprocessing的使用

    该模块提供如下功能: 建立并管理运行指定函数的子进程 基本接口: 1 Process(group, target, name, args[, kwargs]): 初始化子进程对象 2 p.daemon ...

  3. 关于MFC文本框输入内容的获取 与 设置文本框的内容

    八月要开始做界面了<( ̄︶ ̄)/,然而目前只会用MFC╮(╯▽╰)╭ 好吧,言归正传,设置好文本框后,要获取用户输入的内容,可以用: GetDlgItemText() ; 这个函数有两个参数,第 ...

  4. vim : 依赖: vim-common (= 2:7.3.429-2ubuntu2.1) 但是

    Ubuntu 12.10 安装vim出错[日期:2013-01-18] 来源:Linux社区 作者:Cubernet [字体:大 中 小] 在Ubuntu 12.10中安装vim时出现了如下提示:正在 ...

  5. web前端防治重复提交

    web前端开发中防治重复提交 web前端数据请求或者表单提交往往通过对dom的点击事件来操作,但是往往因为认为点击过快(少年手速挺快的嘛),或者因为响应等待使得用户误人为没操作而重复很多次点击,造成表 ...

  6. mingw编译rtmp库

    下载rtmpdump-2.4 进到里面的librtmp目录下面,执行命令:make SYS=mingw CRYPTO= 这样就编译成功静态库和动态库,如何安装到/usr/local/下面? 执行命令: ...

  7. tesseract-ocr 提高验证码识别率手段之---识别码库训练方法

    本文是对tesseract-ocr 使用的进一步技术升级说明,使用默认的识别库识别率比较低怎么办? 不用着急,tesseract-ocr本身的工具中提供了使用你提供的素材进行人工修正以提高识别率的方法 ...

  8. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  9. Sublime Text 3专题

    MarkDown语法记笔记 1.下载&&安装 下载 常用插件安装 Submlit使用教程 [如何优雅地使用Sublime Text3] 2.Sublime Text 便捷技巧 [以PH ...

  10. 每周一书-编写高质量代码:改善C程序代码的125个建议

    首先说明,本周活动有效时间为2016年8月28日到2016年9月4日.本周为大家送出的书是由机械工业出版社出版,马伟编著的<编写高质量代码:改善C程序代码的125个建议>. 编辑推荐 10 ...