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

相关文章
相关标签/搜索