前言: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對象狀態 寫的很是詳細了,我這裏就不過多說明了