NHibernate已經成爲.net主流的ORM框架,固然,在開發中若是須要使用NHibernate的話,咱們通常會對她進行一次封裝,以便在項目中使用更方便,以及對NHibernate有一個全局的控制。而對NHibernate的封裝也不是那麼簡單的,好比說NHibernate沒法作到誇層的封裝,意思就是在其餘層使用封裝的代碼的時候,也是須要引用NHibernate的,好比通常的IQuery條件查詢,若是須要排序或者動態條件的話,就須要傳遞ICriterion到調用層進行設置,固然若是是hql能夠使用拼接的方法,但不推薦這種拼接的方法在UI層使用,這樣跟sql沒有什麼差異。html
下面代碼是我在學習的項目中使用的一點封裝,固然沒有通過嚴格的測試,若有bug請告知。sql
首先是對NHibernate的SessionFactory的封裝,這個就大同小異了session
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Web;
6 using NHibernate;
7 using NHibernate.Cfg;
8 using System.Collections;
9
10 namespace LBC.Permission.DAL
11 {
12
13 public class NHSessionFactory
14 {
15 private static readonly object lockObj = new object();
16 private static NHSessionFactory instance = null;
17 private static ISessionFactory factory;
18
19 private NHSessionFactory() { }
20
21 public static NHSessionFactory Instance
22 {
23 get
24 {
25 if (instance == null)
26 {
27 lock (lockObj)
28 {
29 if (instance == null)
30 {
31 instance = new NHSessionFactory();
32 Configuration cfg = new Configuration();
33 factory = cfg.Configure().BuildSessionFactory();
34 }
35 }
36 }
37 return instance;
38 }
39 }
40
41 public ISession GetCurrentSession()
42 {
43 return factory.GetCurrentSession();
44 }
45
46 public ISession OpenSession()
47 {
48 return factory.OpenSession();
49 }
50
51 public ISessionFactory SessionFactory
52 {
53 get
54 {
55 return factory;
56 }
57 }
58
59 }
60 }框架
而後是對經常使用方法的封裝學習
1 public partial class DataAccess測試
2 {
3 private ISession session;
4
5 public DataAccess()
6 {
7 session = NHSessionFactory.Instance.GetCurrentSession();
8 }
9
10 #region Transaction
11
12 public void Transaction(Action action)
13 {
14 ITransaction transaction = session.BeginTransaction();
15 try
16 {
17 action();
18 transaction.Commit();
19 }
20 catch
21 {
22 transaction.Rollback();
23 throw;
24 }
25 }
26
27 public void Transaction(Action action, System.Data.IsolationLevel isolationLevel)
28 {
29 ITransaction transaction = session.BeginTransaction(isolationLevel);
30 try
31 {
32 action();
33 transaction.Commit();
34 }
35 catch
36 {
37 transaction.Rollback();
38 throw;
39 }
40 }
41
42 #endregion
43 }ui
轉自:http://www.cnblogs.com/liubiaocai/archive/2011/09/17/2179350.htmlspa