什么是使用Castle Active Record和Straight NHibernate的利弊?

时间:2008-12-15 22:53:05

标签: c# nhibernate castle-activerecord

假设编写nhibernate映射文件不是一个大问题......或者使用属性污染域对象也不是一个大问题....

有什么优点和缺点?

有任何基本的技术问题吗?什么往往会影响人们的选择?

不太清楚所有的权衡是什么。

3 个答案:

答案 0 :(得分:21)

最大的AR专家是它为您提供了现成的存储库,并为您负责会话管理。 ActiveRecordBase<T>ActiveRecordMediator<T>中的任何一个都是你最终在NHibernate下组装的礼物。避免XML映射是另一个优点。 AR映射属性易于使用,但又足够灵活,甚至可以映射相当“遗留”的数据库。

AR的最大特点是它积极鼓励你错误地思考NHibernate。也就是说,因为默认会话管理是每次调用会话,所以您会习惯于持久化对象已断开连接,并且在发生更改时必须为Save() d。这不是NHibernate应该如何工作的 - 通常你有每个工作单元的会话或请求或线程,并且对象在会话的生命周期中保持连接,因此更改会自动保持。如果你开始使用AR,然后弄清楚你需要切换到每个请求的会话以使延迟加载工作 - 这在文档中没有很好地解释 - 当你没有期待的对象时,你会得到一个令人讨厌的惊喜当会话刷新时保存。

请记住,Castle团队将AR作为Castle Monorail的补充产品,这是一个类似Rails的.NET框架。它的设计考虑到了这种用途。它不能很好地适应更分层,分离的设计。

使用它是什么,但不要把它当作NHibernate的快捷方式。如果你想使用NH但是避免映射文件,请使用NHibernate Attributes或更好的Fluent NHibernate。

答案 1 :(得分:15)

我发现ActiveRecord是一个很好的工具包,非常适合我用它的小/中项目。像Rails一样,它为您做出了许多重要的决定,这可以让您专注于解决问题。

在我看来,职业和缺点是:

<强>赞成

  • 让您专注于手头的问题,因为很多决定都是为您制定的。
  • 包括成熟,非常有用的基础架构类(存储库,验证等)
  • 编写AR属性比编写XML或NHibernate.Mapping.Attributes恕我直言更快。
  • 良好的文档和社区支持
  • 使用其他NHibernate功能相当容易。
  • 一个安全的开始。你有一个get-out子句。如果你用AR撞墙,你可以慢慢回到定制的NHibernate解决方案。
  • 非常适合域优先开发(生成数据库)。
  • 您可能还想查看ActiveRecord pattern
  • 的优缺点

<强>缺点

  • 你不能假装NHibernate不存在 - 你还需要学习它。
  • 如果您已经有一个遗留数据库可以使用,那么可能效率不高。
  • 不透明的持久性。
  • 内置映射是全面的,但对于某些项目,您可能需要在某些地方恢复到NHibernate映射。我没有遇到过这个问题,只是一个想法。

一般来说,我真的很喜欢ActiveRecord,它总是节省时间,主要是因为我似乎很高兴接受图书馆中的决策和工具,然后花更多时间专注于问题在手里。

我会尝试一些项目并看看你的想法。

答案 2 :(得分:0)

当我开始使用NHibernate时,在我编写Mapping文件并制作课程之前,我没有了解Castle ActiveRecord。那时,我无法辨别出Castle Activerecord会给我什么,所以我没有使用它。

我第二次使用NHibernate时,我只是使用myGeneration来制作映射文件和类,只需查看我的数据库即可。这节省了很多时间,让我(再一次)不用担心Castle Active Record。

实际上,大部分时间用于制作自定义查询,而Castle Active Record不一定有助于此 - 如果你将myGeneration与NHibernate一起使用,你将绕过大部分工作无论如何你还需要做。

编辑:我不想成为myGeneration或NHibernate的啦啦队长。我只是使用这个工具,让我能够快速轻松地完成工作。我花在编写数据访问代码上的时间越少越好。这并不意味着我无法做到 - 但每次编写新应用程序时重新发明轮子几乎没有意义。在需要的地方编写SQL查询和存储过程,而不是在其他地方编写。如果您正在进行CRUD操作,则可以使用ORM。

编辑#2:城堡活动记录可能会带来比我意识到的更多 - 我不太了解其他than what's on their website,但如果它确实带来了更多的表,那么它将有助于潜在的采用者能够在他们的网站上看到它。