[翻译]NHiberante和Active Record,如何选择?

来源:互联网 发布:高级音频算法工程师 编辑:程序博客网 时间:2024/06/02 18:47
翻译自:http://www.ayende.com/Blog/archive/2006/11/02/7116.aspx

版权归原文作者所有,转载请注明出处

NHiberante和Active Record,如何选择?

最近常被问到这个问题,是时候写写对这个问题的看法了
Active Record是对NHibernate的一个封装,目的是让NHibernate更容易使用。我认为使用Active Record最主要的好处就是创建一个工作实体所花费的时间比较短。
使用NHibernate,需要创建XML文件(如果使用attribute,那就是ActiveRecord),比起在属性上应用attribute要费时的多。ActiveRecord做了许多工作,节省了很多配置映射文件花费的时间。
ActiveRecord api也非常简单(体现在两个方面),这意味着学习曲线比较平缓。
然而,要高效使用ActiveRecord,需要理解NHibernate的工作方式,ActiveRecord也暗示着复杂场景下代码的可读性,一般而言,一两个attribute会显著降低代码的可读性.
ActiveRecord的另外一个大问题就是将持久化知识引入并"污染"了领域对象.这显式表现于对象继承ctiveRecordBase<T>以直接得到Save()/Create()/Find***()方法,隐式表现于应用attribute.任意一种方式,领域对象都"知道"了持久化.
使用NHibernate,可以获得一个根本不引用NHibernate的领域模型。对于某些项目,这是一个重要标准.同时也将映射和对象分离,如果想避免以下语句,将非常有用.

[Property("FLD_G"]
public string Name

这个ActiveRecord Attribute唯一的作用就是提醒你底层数据库设计是多么古怪.
Active Record 与 NHibernate之间并没有太大的区别,Active Record做了很多努力,来保证在需要的时候可以直接调用NHibernate.主要的区别是时间的开销,架构选型以及数据库复杂度.

使用指南:

应该:为了简单和易用,Active Record是更好的选择
应该: 在重要项目中使用Active Record之前,应确保了解NHibernate操作的方式
应该:使用Active Record的查询功能以利用NHibernate的HQL以及其他重要特性
不应该:在遗留数据库和很少见的表结构上使用Active Record
不应该:在期望领域对象与持久化无关时使用Active Record
我加入了少见的表结构这一条,是因为很多情况下,用户希望做特别的事情,比如自定义用户类型,动态实体映射等.


评论(部分):
1.
我将第五条原则拆分成两个:
应该:如果结构不是很复杂,那么可以在遗留数据库上使用ActiveRecord
不应该:在极少见的库结构上使用ActiveRecord,不管是遗留数据库还是新数据库
2.
使用的某些词汇不是很妥当
这样可能更好:
应该:在数据模型和领域模型十分接近以及数据库结构容易理解的情况下使用Active Record
不应该:在数据模型有不常见映射或者数据库结构使用不常见结构或使用数据库特定功能的情况下使用Active Record
3.
我使用ActiveRecord最大的问题就是:它将单元测试时的模拟变得复杂.我认为领域驱动开发下使用NHibernate以及repository对象,可以使我们非常容易的得到可测试的领域模型.
原创粉丝点击