YYW'S BLOG

知识的分享就是知识的获得
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

移植 Castle 的 ActiveRecord 直接为 NHibernate 所用

Posted on 2006-10-27 21:47  阿武  阅读(3910)  评论(9编辑  收藏  举报

         在动手写这篇 Post 之前我得先声明一下,本人对 Castle 的了解还不够深入,仅仅在近期在项目中使用过而已,所以我的做法不一定是正确的,也不一定能给大家带来帮助,说不定还会给你带来更多的麻烦

         把 Posts 发到首页上也是希望大家都能说出自己的想法,还有我的处理方式的可行性做一些分析和批评。


         从对 Castle  一无所知到有所了解,Terrylee 的 Castle 开发系列(推荐) 给了我很大的帮助,特在此对 Terrylee 表示感谢。

         对于我自己而言我并不太喜欢 Castle 封装 NHibernate 的方式, 虽然减少了配置映射文件的复杂性和易出错,但我还是更喜欢把映射文件和实体类分开来,我觉得这更加直观,看起来也不会太凌乱,唯一的缺点就是有时候会顾此失彼,但我认为这是值得的。就好比是 ASP.NET 将界面和代码相分离,但萝卜青菜各有所爱,我们所要做的就是像找女朋友一样选自己喜欢的。

         Castle 把 ActiveRecordBase 声明为 abstract 以至于在实体类直接继承并实现一些自操作行为,如 Save()、 Create()、Update()、Delete() 也是我深恶痛绝日,我非常不喜欢把业务操作移殖到实体层去,层与层之间的职任应该划分得很清晰,要不然我看了就觉得不舒服,可能有人会说如果不喜欢我完全可以不去理会它,当它不存在就是了,但它却确确实实地存在着,还是 public ,无论走到那里都能看到自己不喜欢的东西我还能无动于衷吗?而且我们还有同样方便方法来代替,稍后将会讲到,所以我要把 ActiveRecordBase 改造成为 ActiveRecord 并且只留下静态方法,相当于一个 NHibernateHelper。

         至于 IOC 容器我更喜欢 Spring.Net,虽然比较复杂,但还是那句话,萝卜青菜各有所爱。

         接下来就开始我们的改造工作,首先是 Session 管理的问题,由于现在我没时间研究 Castle 的源码,加上水平有限,决定另寻它路。于是在 DDLLY命名空间 里找到了 NHibernate的Session管理,我承认通过 IHttpModule 来存储 Session 不失为了一个好方法,但它仅解决了客户端请求操作的问题,当请求来自服务器端的时候 HttpContext.Current 将为 NULL 值。我的解决方法是新建一个 SessionObject 类,类中两个属性,一个用于存储 Session 值,另一个用于标记操作完成后是否关闭 Session,当 HttpContext 为空时创建一个新的 SessionObject 实例并将其标记为需要 Close,这样做的缺点是每次操作都必须检查是否需要关闭 Session,但暂时还想不到更好的解决方法就先凑合着使用了。

         下面是我改造过后的代码,这个类并不能独立工作,它还依赖于其它类,在后面我会放上完整项目供下载。


         为了解决 ActiveRecordBase 带来的便利性的问题,但又不破解层的职责分配问题,我们同样需要一个基类。一般的三层架构我都会以如下形式分配,



        从项目名称上基本就可以了解到是干什么用的了,现在我们在 IDAL 中添加一个基接口 IDalBase<T> ,其中 T 为对应的实体类类型,接口中包含了一些常用的增删改查(GRUD)操作,如果你的项目没有接口层刚此步省略。


         接着是在 DAL 层中创建一个实现了 IDalBase<T> 接口的基类 DalObjectBase<T>,不仅要感叹 .NET 2.0 来的真是时候,如果没有泛型,这一切我们将很难实现。



         项目下载

         在希望能给大家带来帮助的同时也希望能收到更多指导性的意见,共同交流,共同进步。
         明天可以睡懒觉了,祝大家周末愉快 :)