当你还在纠结于ORM的性能时,我已经远远的把你抛在脑后
最近找工作面试,问到一些过去的工作和项目经验。我把公司用到的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的性能时,我已经远远的把你抛在脑后的更多相关文章
- 测试Data ORM的性能
闲着无聊,测试了一下公司ORM的性能,和其它的ORM相比,该有的都有了,不该有的也勉强塞了进去,总体考虑是并发与扩展性问题,譬如读写分离,消息总线服务整合,缓存内置. 测试机是I7,16G内存,这里只 ...
- 还在纠结 Flux 或 Relay,或许 Redux 更适合你
重磅消息,Redux 1.0 发布,终于可以放心用于生产环境了! 在这个端应用技术膨胀的时代,每天都有一大堆框架冒出,号称解决了 XYZ 等一系列牛 X 的问题,然后过一段时间就不被提起了.但开发的应 ...
- 还在纠结注册.com域名还是.cn域名?
一.概念 .com域名,国际最广泛流行的通用域名格式.国际化公司都会注册. .com域名:当然也可以选择.net/.org以.com为结尾的国际域名. 例如表示工商企业的 .com. 同时还有 .ne ...
- 还在纠结学什么编程语言吗?Python可能会“教”你做人
这几年为什么Python在中国就火起来了? Python这个东西国,大概是从2017年末开始,突然就火了起来的.此前,对于Python,乃至编程,绝大多数程度上都是专业人士的话题,在普通大众层面上起不 ...
- 阮一峰大神的快排?刚才还在纠结sort()的我!真是个小傻瓜
看到这个标题之后 我毫不犹豫的点进去了 趁现在不忙我赶紧把代码写到了我的小本本上好好研究研究 (写的就不放进来了 有点丑) 研究了下 第一反应 明明能用sort()解决的 为什么非要写这么一大串 但 ...
- 对posintion属性的简单认识,对于还在纠结的同学们,有一定的帮助
position的四个属性值: relative ,absolute ,fixed,static 下面分别讲述这四个属性,以简单代码表示 <div id="parent" ...
- Mego(1) - NET中主流ORM框架性能对比
从刚刚开始接触ORM到现在已有超过八年时间,用过了不少ORM框架也了解了不少ORM框架,看过N种关于ORM框架的相关资料与评论,各种言论让人很难选择.在ORM的众多问题中最突出的问题是关于性能方面的问 ...
- 那些年,UI设计师还在手工标注和切图时走的弯路
在我从事UI设计师这几年的工作中逐渐发现,最让人糟心的不是应付各种奇葩的需求,完成设计稿,而是交付.每次交付的设计稿和最后开发出来的产品总是让我心塞无比,很少最终产品和我的设计稿是完全一致的. UI设 ...
- 【网络文摘】Androidguy:当你的才华还无法撑起你的野心时,那么应该静下心来学习
[序] 2013年12月初,接到51CTO的邀请写一篇关于挨踢人物传记的邀请.尽管写文章对我已不是什么新鲜事.数年来写的书和博客至少也在600万字以上.不过基本都是与技术有关的.写传记这还是头一次,也 ...
随机推荐
- 使用github与jekyll搭建个人博客(一)
虽然使用博客园还没有多久,但是最近看到一些大神的博客觉得很是炫酷.于是突发奇想,想要搭建自己的博客站点儿.编程菜鸟一枚,还是想要记录下最近的搭建博客经历. 使用github搭建个人博客的方式有很多,百 ...
- TortoiseSVN客户端使用说明
TortoiseSVN客户端使用说明 TortoiseSVN不是一个独立的窗口程序,而是集成在windows右键菜单中,下面对TortoiseSVN的菜单项做简要的说明.01.SVN Checkout ...
- chrome 问题
1.chrome表单自动填充去掉input黄色背景解决方案 http://blog.csdn.net/wangxiaohui6687/article/details/10149579 2.chrome ...
- ADO.NET Entity Framework
ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案, 早期被称为 ObjectSpace,现已经包含在 V ...
- Irrlicht 鬼火
1.下载引擎 2.引入头文件 在VS2010下新建项目,项目->属性->配置属性->VC++目录 在包含目录中:添加 引擎安装目录\include\ 在库目录中:添加 引擎安装目录\ ...
- 微信网页开发之创建Controller(三)
首先,我们需要在App区域下添加一个控制器,这里我们就以AppDemoController为例.如下图所示: 注意:你也可以自己创建其他区域,只是这里推荐使用App区域. 创建好之后,请添加自己的Ac ...
- 深入理解openstack网络架构(4)-----连接到public network
原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture3 译文转自:http://b ...
- asp.net identity 2.2.0 中角色启用和基本使用(三)
创建控制器 第一步:在controllers文件夹上点右键>添加>控制器, 我这里选的是“MVC5 控制器-空”,名称设置为:RolesAdminController.cs 第二步:添加命 ...
- [后端人员耍前端系列]KnockoutJs篇:快速掌握KnockoutJs
一.引言 之前这个系列文章已经介绍Bootstrap.由于最近项目中,前端是Asp.net MVC + KnockoutJs + Bootstrap来做的.所以我又重新开始写这个系列.今天就让我们来看 ...
- 讲讲HashCode的作用
前言 Object提供给我们了一个Native的方法“public native int hashCode();”,本文讲讲Hash是什么以及HashCode的作用 Hash 先用一张图看下什么是Ha ...