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

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

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

如果您对ORM没兴趣,为不浪费您宝贵的时间,请点又上角红叉。

Repository设计

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

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

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

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

在BaseRepository中就使用到了上一篇中的Session管理策略。

分页组件

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

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

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

可使用Query对象,也可直接使用HQL。

分页的实战

注意:对于复杂的查询建议不要太考虑分层,就算留点灰色空间吧。因为多实体关联考虑到自定义的别名(比如from obj1 as o1 left join o1.XXX as o2 where o2.XXX=XXX),如果别名由业务层或更高层指定的话,相当于高层类库需要了解低层类库中HQL的结构了,这种情况分层不如不分。

另外简单的分页条件查询可以使用如下示例。

条件查询

排序

事务管理和Repository的重用考虑

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

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

这里使用BaseService自己封装的事务控制。

Session.SaveOrUpdate()也可以调用仓储的Update()代替,比如:new PurchaseOrderRepository().Update();

花絮

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

参考过很多书籍和博客

感谢博客园前辈们

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

参考书籍

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

《领域驱动设计》

附件下载

NHibernateFramework.rar

基于NHibernate的开发框架的设计的更多相关文章

  1. 【翻译】首个基于NHibernate的应用程序

    首个基于NHibernate的应用程序  Your first NHibernate based application 英文原文地址:http://www.nhforge.org/wikis/how ...

  2. 基于NHibernate二级缓存的MongoDB组件

    设计一套基于NHibernate二级缓存的MongoDB组件(上)   摘要:NHibernate Contrib 支持很多第三方的二级缓存,如SysCache,MemCache,Prevalence ...

  3. 基于DDD的微服务设计和开发实战

    你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴 ...

  4. 基于STM32+华为云IOT设计智能称重系统

    摘要:选择部署多个重量传感器和必要的算法.通过WiFi 通信模块.GPS定位模块,采集车辆称重数据一地理位置信息,并通过网络发送至云平台,设计图形化UI界面展示称重.地图位置等重要信息,实现对称重系统 ...

  5. 基于SqlSugar的开发框架循序渐进介绍(2)-- 基于中间表的查询处理

    在前面介绍的SqlSugar的相关查询处理操作中,我们主要以单表的方式生成相关的实体类,并在查询的时候,对单表的字段进行条件的对比处理,从而返回对应的数据记录.本篇随笔介绍在一些外键或者中间表的处理中 ...

  6. 基于SqlSugar的开发框架循序渐进介绍(3)-- 实现代码生成工具Database2Sharp的整合开发

    我喜欢在一个项目开发模式成熟的时候,使用代码生成工具Database2Sharp来配套相关的代码生成,对于我介绍的基于SqlSugar的开发框架,从整体架构确定下来后,我就着手为它们量身定做相关的代码 ...

  7. 基于SqlSugar的开发框架循序渐进介绍(4)-- 在数据访问基类中对GUID主键进行自动赋值处理

    我们在设计数据库表的时候,往往为了方便,主键ID一般采用字符串类型或者GUID类型,这样对于数据库表记录的迁移非常方便,而且有时候可以在处理关联记录的时候,提前对应的ID值.但有时候进行数据记录插入的 ...

  8. 基于SqlSugar的开发框架循序渐进介绍(5)-- 在服务层使用接口注入方式实现IOC控制反转

    在前面随笔,我们介绍过这个基于SqlSugar的开发框架,我们区分Interface.Modal.Service三个目录来放置不同的内容,其中Modal是SqlSugar的映射实体,Interface ...

  9. 基于SqlSugar的开发框架循序渐进介绍(6)-- 在基类接口中注入用户身份信息接口

    在基于SqlSugar的开发框架中,我们设计了一些系统服务层的基类,在基类中会有很多涉及到相关的数据处理操作的,如果需要跟踪具体是那个用户进行操作的,那么就需要获得当前用户的身份信息,包括在Web A ...

随机推荐

  1. jquery音乐播放器(歌词滚动版)

    好久没出来水了!!!忙忙碌碌的找工作~然后中秋节也算过了,祝各位coding们,直接觉醒第七感小宇宙,直接用心就能找到bug-_-// 最后如题这是一篇很正规的coding的文章 大概么比以前的加了个 ...

  2. 黑客攻防技术宝典Web实战篇(三)web攻击方式总结

    web攻击的手段无非就是使服务器资源耗尽,使服务器无法接收正常请求. 一.DDos攻击 二.DRDos攻击 三.慢攻击 与Ddos攻击相反,慢攻击并不是以多取胜,而是靠保持连接.

  3. IOS开发之----NSDictionary,JSON和XML互相转换

    本文永久地址为 http://www.cnblogs.com/ChenYilong/p/4044521.html,转载请注明出处.     -(void)test {     //XML文本范例   ...

  4. 湖南附中模拟day1 瞭望塔

    /* 这个题要用到树的性质,一般比较难的图论题会往这方面靠拢,这样用很容易出错,应该先写暴力,然后再去一点点想正解 */ //暴力70分 #include<iostream> #inclu ...

  5. 【C语言入门教程】2.8 C 语言的预处理命令

    预处理命令是在程序编译阶段进行执行的命令,用于编译与特定环境相关的可执行文件.预处理命令扩展了 C 语言,本节将选择其中一些常用的预处理命令进行讲解. 2.8.1 宏替换命令 宏替换命令的作用类似于对 ...

  6. mysql索引优化

    mysql 索引优化 >mysql一次查询只能使用一个索引.如果要对多个字段使用索引,建立复合索引. >越小的数据类型通常更好:越小的数据类型通常在磁盘.内存和CPU缓存中都需要更少的空间 ...

  7. Javascript正则表达式匹配替换

    根据正则表达式的匹配结果将匹配项替换为*function regReplace(reg, str){ var result, //最终输出结果 out, //每次运行正则exec返回的匹配结果. in ...

  8. android常见问题(一)

    一:文本的颜色选择器: 在res目录下面创建color文件夹,在color文件夹下面创建font_style_colors.xml文件<?xml version="1.0" ...

  9. Android常用的工具类

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils. Prefe ...

  10. 第一款支持容器和云部署的开源数据库Neo4j 3.0

    导读 Neo4j 3.0.0 正式发布,这是 Neo4j 3.0 系列的第一个版本.此版本对内部架构进行了全新的设计:提供给开发者更强大的生产力:提供更广阔的部署选择.Neo4j 3.0 被认为是世界 ...