LSJ_NHibernate第三章 IDAL,DAL,BLL NHibernate系列文章七:NHibernate對象狀態

前言:html

  作項目(面向數據編程),首先必須瞭解業務,這是核心,不懂業務寫出來的代碼毫無心義.業務我這裏分爲兩種,簡單業務操做,複雜業務操做,我以他們操做表的界限進行區分,假設我更新一條數據,只操做了一張表,我就把它看成一個簡單的業務操做,假設用戶購買產品這個操做,業務執行過程當中,我必須修改用戶表,訂單表....操做了多張表,且這是一個事務,我就當它是複雜的業務操做.數據庫

IDAL層,數據庫操做接口層,定義全部的簡單業務操做接口,代碼以下編程

 1 namespace DAO.IDAL {
 2     /// <summary>
 3     /// 接口層D_News
 4     /// </summary>
 5     public interface INews
 6     {
 7         #region  成員方法
 8         /// <summary>
 9         /// 是否存在該記錄
10         /// </summary>
11         bool Exists(object id);
12         /// <summary>
13         /// 增長一條數據
14         /// </summary>
15         object  Save(News model);
16         /// <summary>
17         /// 更新一條數據
18         /// </summary>
19         void Update(News model);
20         /// <summary>
21         /// 刪除數據
22         /// </summary>
23         void Delete(object id);
24         /// <summary>
25         /// 刪除數據
26         /// </summary>
27         void Delete(News model);
28         /// <summary>
29         /// 獲得一個對象實體
30         /// </summary>
31         News Get(object id);
32         /// <summary>
33         /// 得到數據列表
34         /// </summary>
35         IList<News> LoadAll();
36         /// <summary>
37         /// 得到前幾行數據
38         /// </summary>
39         IList<News> GetList(List<SearchTemplate> st, List<Order> order);
40         
41         /// <summary>
42         /// 得到總條數
43         /// </summary>
44         int GetCount(List<SearchTemplate> st);
45         #endregion  成員方法
46     } 
47 }

我將這些簡單業務操做抽象出來,這裏用到IOC(控制反轉)的原理,數據訪問層不依賴於業務訪問層,而依賴於接口,業務訪問層的簡單業務操做依賴於接口,這樣就能實現業務與數據訪問的解耦,簡單來講你能夠寫N個數據訪問層,只要實現接口便可,可能這裏又有人不理解了,我寫一個數據訪問層就夠累了,還寫多個那不是有病嗎?那是由於考慮的項目都比較的小,假設要作一個企業級大項目,有1000張表,分配給10我的完成,有些人以爲EF好用,有些以爲手寫SQL速度快....因此咱們更應該面向接口去編程,讓細節依賴於接口,實現解耦.session

IDAL這個類運用面向對象的知識點,還能夠進行簡化,仔細觀察假設咱們有100張表的DAL,你會發現除了每一個類對應的model不同,其它的都是如出一轍,這個時候就能夠運用泛型進行提取,如post

public class INew<T> where T : new()
{
}

這樣100個類只用寫一個類就能夠了學習

DAL層,數據訪問層url

1      public IList<News> LoadAll()
2         {
3             using (ISession session = sessionFactory.OpenSession())
4             {
5                 return session.QueryOver<News>().List();
6             }
7         }
1 public IList<News>  GetList(List<SearchTemplate> st, List<Order> order)
2         {
3             using (ISession session = sessionFactory.OpenSession())
4             {
5                 ICriteria crit = session.CreateCriteria(typeof(News));
6                 IList<News> customers = ManagerPage.GetCrit<News>(st, order, crit);
7                 return customers;
8             }
9         }

這裏我調用NHibernate提供的接口進行數據訪問操做便可,好比QueryOver,ICriteria...根據我的喜愛了,同理這個類也能提取spa

BLL業務邏輯層code

 1     public partial class B_News
 2     {
 3         private readonly INews dal = new D_News();
 4         public B_News()
 5         {}
 6         
 7         #region  Method
 8         public IList<Domain.News> GetList(List<SearchTemplate> st, List<Order> order)
 9         {
10             return dal.GetList(st, order);
11         }
12 
13         public int GetCount(List<SearchTemplate> st)
14         {
15             return dal.GetCount(st);
16         }
17 
18         public int Save(Domain.News model)
19         {
20             return Convert.ToInt32(dal.Save(model));
21         }
22 
23         public Domain.News Get(object id)
24         {
25             return dal.Get(id);
26         }
27 
28         public void Delete(object id)
29         {
30             dal.Delete(id);
31         }
32 
33         public void Update(Domain.News model)
34         {
35             dal.Update(model);
36         }
37         #endregion
38    
39     }

這裏的簡單業務操做也能夠用泛型進行提取,複雜的業務操做必須手寫了,寫以前請先熟悉NHibernate的生命週期,這裏我附上我學習時候的一張圖htm

詳細的能夠去看丹尼大叔的博客NHibernate系列文章七:NHibernate對象狀態 寫的很是詳細了,我這裏就不過多說明了

相關文章
相關標籤/搜索