Websharp.ORM 3.0
徐芳波
介绍
Websharp原作者是孙亚民,项目起始于2003年, ORM是Websharp最重要的部分,设计上参考了JDO。关于Websharp的更多情况可以参考 www.websharp.org和孙亚民的blog:http://sunnyym.cnblogs.com。
本人从2003年开始关注和学习Websharp,也为Websharp做过一些工作。2005年底,.NET Framework2.0还没有正式发布的时候,我们通过互联网组织了大概有15个人的项目团队,开发一个新版本的Websharp(当时叫Websharp2005)。当时参加的成员热情都非常高,但是由于国内程序员的环境问题,又加上我们组织水平有限,真正开发的只有孙亚民和我。
一般ORM都会存在性能问题,Websharp2005之中的性能问题在于使用了大量反射,特别是当查询大量数据,并填充每个实体的属性的时候。我和孙老大认为可以使用CodeDom生成强类型化的PersistenceManager来解决这个问题,那个时候我便想着要开发新版本的Websharp.ORM。
我当时在公司的一个Web项目中使用了Websharp2005,后来发现因为Websharp2005当时不是很健壮,反射在调试的时候也相对麻烦,在做这个项目的过程中,我便开始开发了Websharp.ORM2.0这个版本。
Websharp.ORM2.0从设计到实现,进度很快,基本完成以后,热情相对减弱,我发布了一个2.0的版本,并没有整理文档,所以效果不是很好。
这段时间,有很多的人和我联系,问Websharp的发展。另外让我非常高兴的是,一些朋友基于Websharp开发项目,这对Websharp的促进非常大。到目前为止,Websharp已经比较实用。关心Websharp的朋友还是很多的,不过Websharp的资料一般都是孙亚民写出来的, 总的来说还很少,而且孙亚民说在的角度一般都是理论上的,比较实践性相对较少。很多朋友总是问一些对于我来说简单,而又重复的问题。所以我决心在春节前一定要把自己关于Websharp的东西都整理出来,对于我也是完成了一桩心事,如果对其他朋友能有所帮助,我就欣慰了。更重要的是,这些文档和Demo对Websharp的发展都是很好的积累。
在开发和使用Websharp.ORM的过程中,为了摆脱配置实体的重复劳动,和减少配置出错的几率,我开发了Websharp.Editor作为Websharp的工具,Websharp.Editor以前叫Websharp.Tool,开始的目的只是为了可视化配置实体,实体的元数据保存到xml文件中,然后根据这些元数据使用CodeDOM生成实体类。后来在这个工具之上加入了实体配置验证功能,再后来我发觉我维护的这个实体的元数据就是一个宝贝,有了这个元数据我可以做很多简单但是很强大的工作,比如生成业务类、生成界面、数据库表、数据字典文档等。在这次文档整理的同时我也重构这个工具,改名为Websharp.Editor,为了这个工具的扩展性,Websharp.Editor的底层结构采用了SharpDevelop,并且这次给Websharp.Editor加入了实体建模的功能,这个功能使用了Netron开源绘图项目。Websharp.Editor在界面代码生成方面比较弱,我没有花太多的精力,主要是界面与各自的项目团队关系比较大,不要做的太细,提供一个基本的架构,使用人员自己修改就可以了。
本人目前从事应用软件系统平台的开发,非常喜欢Websharp.Editor,如果有足够的时间可以把Websharp.Editor发展成一个开发平台。
Websharp.ORM3.0 与历史版本的区别
Websharp.ORM 3.0和Websharp2005接口大部分相同,不过有一些差别,这里说明一下,本人经验有限,请提出宝贵意见:
使用强类型化的PersistenceManager<T>
为了解决ORM的性能问题,Websharp.ORM 3.0使用动态编译技术为每个实体类型都生成一个强类型化的PersistenceManager<T>。
不再管理实体状态
企业级或者理论上的框架,都支持实体的状态管理,比如管理实体是新建状态,还是修改状态。.Net下有一个框架CSLA甚至让实体具有撤销/恢复功能。我认为在很多的情况下,管理这些特性是很有用的,不过更多的情况下,不需要管理实体的状态,所以Websharp.ORM 3.0把这个特性去掉了。如果需要的话,还可以再加上。
去掉企业库的缓存
Websharp.ORM 3.0中取消了缓存处理,原因是没有好的方案来处理缓存
1,原来的缓存是基于微软企业库的,我认为ORM尽量不要依赖第三方组件
2,使用微软企业库需要维护,使用不当会造成麻烦
3,大多数的情况不需要进行缓存,主要是单个对象的处理缓存没有必要,多个对象的缓存很难实现,比如关联查询,父子对象的相关性等等。
4,如果确实需要缓存,可以自己实现。
事务
.Net下数据库事务主要分为连接的数据库事务和分布式事务, .NET Framework 2.0之前,大部分的框架的事务都是基于连接的,因为此种情况下直接基于ADO.Net的IDbConnection进行封装实现事务比较简单。但是对于分布式事务,没有比较好的方法。
.NET Framework 2.0中新增了System.Transactions命名空间,使用 System.Transactions 命名空间包含的类可以编写自己的事务应用程序和资源管理器。具体地说,可以创建和参与(与一个或多个参与者)本地或分布式事务。
不过System.Transactions只支持Sqlserver数据库。
浙公网安备 33010602011771号