前言: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对象状态 写的很是详细了,我这里就不过多说明了