最近找工作面试,问到一些过去的工作和项目经验。我把公司用到的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. Unity中使用多构造函数(转)

    如果要实例化的类只有一个构造函数, 则使用方法很简单使用方法如下: 1 2 3 4 5 6 7 using (IUnityContainer container = new UnityContaine ...

  2. 使用小技巧,让你高效使用Eclipse

    1.自动完成--Eclipse有一个自动完成代码功能,快捷键是ctrl + space.当点击时就会弹出一个对话框,上面有与前后文相关的一些建议.只要有一个可能性,Eclipse就会替你完成. 2.快 ...

  3. i love matlab

    新手上路~话说图像修复熟么的真的很有意思~忽的想起NG讲的一个笑话:它让我赚了很多钱,买了车子,买了房子,so what's that? It's Matlab <( ̄3 ̄)> 前两天一直 ...

  4. boost的编译

    第1步: 先从官网(www.boost.org)下载最新版的BOOST源码,如图所示 我这里下的是zip的那个第2步:编译源代码(放心.这里是傻瓜式的操作,很容易操作)(1)先把源代码放在E盘,例如 ...

  5. android数据库SQLite的设计模式

    Dao设计模式可能是使用最多的数据库的设计模式其基本思路是将数据库操作的代码 与设计代码分离以便于维护和升级.具体的实现方法是使用包,然后在设计代码中调 用数据库的操作代码,dao设计模式需要创建5个 ...

  6. MicroPHP 2.2.0 发布

    ver 2.2.0: 增加了:     1.$this->cache为最新的phpfastcache2.1,缓存功能更加强大,而且编写自己的缓存类非常容易.     2.自定义缓存类说明:   ...

  7. Android前端人员与后台开发的撕逼(一)

    首先表明一下身份,本人是Android前端开发人员,本篇只做合理性探讨,不进行人身攻击: 其次希望各位大神进行点评!点评!点评! 我们讨论一下接口的两种返回方式,直接举例说明一下,假设书籍信息表有30 ...

  8. Ember.js之动态创建模型

    本人原文地址发布在:点击这里 What problem did we meet? As ember document suggestion, we may define a model as a st ...

  9. .NET Framework3.0/3.5/4.0/4.5新增功能摘要

    Microsoft .NET Framework 3.0 .NET Framework 3.0 中增加了不少新功能,例如: Windows Workflow Foundation (WF) Windo ...

  10. Android(shape.xml)

    shape用以在android设计中定义几何形状,这样简单的效果就不需要以来背景图片.基本的功能如下: <shape xmlns:android="http://schemas.and ...