NHIBERNATE的简单框架的设计

上次的 NHibernate的Session管理策略和NHibernateHelper 发布并提供下载,给NHibernate刚入门的同学们带来很多便利。

最近有同学在求NH的通用仓储,正好我最近也设计了一个应用于实战,好吧,无私地分享并快乐着吧。

与上次一样,您无需关心细节,因为我会在最后提供源代码的下载。

如果您对ORM没兴趣,或者觉得此文看标题与大多数文章类似的话,为不浪费您宝贵的时间,请点又上角红叉。

Repository设计

从整体上可以看到,这个仓储用到了泛型,并且继承了一个叫BaseRepository。

BaseRepository的作用就是为仓储提供一个特定的Session上下文,以便仓储中使用和执行事务。

(这里提供的上下文都是NH自带的一些功能,并没有做扩展。有兴趣玩更复杂的,请关注我的数据访问层设计。)

你会看到这个仓储除了有普通的增删改的行为以外,还提供了一系列的查询,

这是为了在具体仓储中可以少写一些代码,另外这些行为都比较细,是为了在业务层重新组装成业务组件来使用,比如分页组件。

细心的朋友可能会发现了一个函数(TranslateQuery),它是用来将Query对象翻译成NH的条件查询,因为我尽可能地做到HQL或SQL不出现在数据访问层之外。

(可以将这个翻译函数改写成翻译成HQL)

在BaseRepository中就使用到了上一节中的Session管理策略,不再详细解说。

仓储实战

这是一个仓储的例子,可以看到刚才函数的设计的确帮助我们减少了代码(this.GetCount)。

这里的调用可以看到将HQL移到了仓储内,保持逻辑清晰。

分页组件

分页组件的实现非常简单,因为前面仓储已经做好了铺垫,明确地说,这个分页组件不在仓储,而是组织仓储功能。

因为作者认为有些分页需要返回一个总记录数,这个其实是特定的分页插件需要考虑的,而仓储不应该知道UI插件的存在而专门为一个UI插件提供功能。

你会发现GetCount函数并没有白白准备,而实战中关联对象的List<T>.Count可能会做一次延迟加载的查询,所以这个函数必不可少。

分页的实战

条件查询

排序

事务管理和Repository的重用考虑

我们通常会在领域模型Service中组织仓储,供更上层的调用,而在仓储中控制事务的打开和提交,明显会阻碍仓储在业务层被重用。

解决的思路可以看我的业务逻辑层设计——事务的考虑,下面我给出一个简单的做法。

看了以后你会发现事务中间的代码非常简单,其实复杂的逻辑早已被封装在这个order对象里面,有兴趣研究的同学可以参考我的业务逻辑层设计和示例代码。

这里使用BaseService自己封装的事务控制,而没有使用Spring.NET,因为我不想再为了减少代码而转移到XML配置文件,保持简单和学习成本。

花絮

这个项目本来是基于.NET2.0的,所以我并没有打算给他升级,所以NH版本选择了2.1,也就没有Linq, 也就没有fluent。

设计过程当中到了很多阻碍,EasyUI也只是点到为止Grid没用,展示层使用MVP模式被抱怨代码难以理解,

作为架构师应该推荐好的技术和框架向社区、公司或同事,可以看到这个本版移除了Spring.NET,没有采用微软企业库,这算是一种对公司的妥协。

好了,就到这里,英语真的在催我了,我先去了。

参考过很多书籍和博客

感谢博客园前辈们

李永京、弦哥、刘冬.NET、博客园NHibernate专题。

参考书籍

《Microsoft .NET企业级应用架构设计》

《领域驱动设计》

附件下载

NHibernateDemo

 
 

NHIBERNATE的简单框架的设计的更多相关文章

  1. 【Yom框架】漫谈个人框架的设计之三:业务接口+UI层的设计(基于Castle实现的Repository)

    Repository层设计的文章见:[http://www.cnblogs.com/yomho/p/3297042.html]   一.概要设计 上面Reposity 应该为 Repository 特 ...

  2. [连载]《C#通讯(串口和网络)框架的设计与实现》- 11.调试器的设计

    目       录 第十一章     调试器设计... 2 11.1         调试接口... 2 11.2         界面方式调试... 3 11.3         命令行方式调试.. ...

  3. [连载]《C#通讯(串口和网络)框架的设计与实现》-1.通讯框架介绍

    [连载]<C#通讯(串口和网络)框架的设计与实现>- 0.前言 目       录 第一章           通讯框架介绍... 2 1.1           通讯的本质... 2 1 ...

  4. [连载]《C#通讯(串口和网络)框架的设计与实现》-2.框架的总体设计

    目       录 C#通讯(串口和网络)框架的设计与实现... 1 (SuperIO)- 框架的总体设计... 1 第二章           框架总体的设计... 2 2.1           ...

  5. Java日志系统框架的设计与实现

    推荐一篇好的文章介绍java日志系统框架的设计的文章:http://soft.chinabyte.com/database/438/11321938.shtml 文章内容总结: 日志系统对跟踪调试.程 ...

  6. 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例

    本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的 ...

  7. 类Shiro权限校验框架的设计和实现(2)--对复杂权限表达式的支持

    前言: 我看了下shiro好像默认不支持复杂表达式的权限校验, 它需要开发者自己去做些功能扩展的工作. 针对这个问题, 同时也会为了弥补上一篇文章提到的支持复杂表示需求, 特地尝试写一下解决方法. 本 ...

  8. MVC+Spring.NET+NHibernate .NET SSH框架整合 C# 委托异步 和 async /await 两种实现的异步 如何消除点击按钮时周围出现的白线? Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法

    MVC+Spring.NET+NHibernate .NET SSH框架整合   在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MV ...

  9. 小菜的系统框架界面设计-XiaoCai.WinformUI代码开源

    我的源码分享 曾经,看到别人漂亮的系统界面,合理的布局,可是却没有提供源码,道理很简单,就是有偿提供,实际上对于有些技巧的东西也并没有多么难,只是不懂原理,感觉到困难罢了. 而对于刚毕业的我,求知欲强 ...

随机推荐

  1. 【百度地图API】自行获取区域经纬度的工具

    原文:[百度地图API]自行获取区域经纬度的工具 摘要:上一章教大家如何建立自己的行政区域地图.这次为大家提供一个,可视化选择区域,并且能自动生成经纬度代码的工具.工具的源代码完全公开,并且做了详尽的 ...

  2. Android 4.4 沉浸式透明状态栏与导航栏

    Android 系统自4.2 開始 UI 上就没多大改变,4.4 也仅仅是添加了透明状态栏与导航栏的功能,如图 那么如今我就来给大家解说下怎样使用这个新特性,让你的 app 尾随潮流,当然假设你不在乎 ...

  3. webBrowser.execWB的完整说明

    原文:webBrowser.execWB的完整说明 在不是js打开的页面上按window.close(), 会有提示框,很烦,现在可以不用了,没有提示框直接关闭窗口.试试下面代码: <objec ...

  4. Mac下Android配置及unity3d的导出Android

    昨晚实在弄的太晚了,费尽脑汁才弄出来. ok,关于mac下的eclipse的安卓配置,我仅仅贴一个网址,就ok了 http://developer.android.com/sdk/index.html ...

  5. 动态创建一些常的html标签

    原文:动态创建一些常的html标签 一段时间来,不管是在学习还是应用asp.net mvc应用程序,较多情况之下,需要动态创建一些html标签.如这篇<文本框下面有两个铵钮,点就加点减就减> ...

  6. 第39届ACM亚洲区域赛牡丹江赛区赛后总结

    2014年10月10日,周五,早晨匆匆忙忙的出了寝室,直奔复印社去打了两份模板,然后直接就去上课了.第三节课下课,直接跟老师讲了一声,就去实验室跟学长们汇合了.12点半,踏上了开往牡丹江的列车,我们那 ...

  7. nodejs开发aspnet5项目

    结合nodejs开发aspnet5项目 1.安装kvm   官方教程地址:https://github.com/ligershark/Kulture 打开 powershell命令窗口,找不到可以在开 ...

  8. AngularJs应用页面

    AngularJs应用页面切换优化方案   葡萄城的一款尚在研发中的产品,对外名称暂定为X项目.其中使用了已经上市的wijmo中SpreadJS产品,另外,在研发过程中整理了一些研发总结分享给大家.如 ...

  9. TODOList项目

    [ 爱上Swift]十二期:TODOList项目   好久没有写Swift甚是想念,Swift,Xcode都比较稳定了写个程序熟悉一下,当然时间原因都是小Demo,废话不多说先上图. 下面是跑起来之后 ...

  10. leetcode第11题--Container With Most Water

    Problem: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate ...