zoukankan      html  css  js  c++  java
  • LSJ_NHibernate第三章 IDAL,DAL,BLL

    前言:

      做项目(面向数据编程),首先必须了解业务,这是核心,不懂业务写出来的代码毫无意义.业务我这里分为两种,简单业务操作,复杂业务操作,我以他们操作表的界限进行区分,假设我更新一条数据,只操作了一张表,我就把它当作一个简单的业务操作,假设用户购买产品这个操作,业务执行过程中,我必须修改用户表,订单表....操作了多张表,且这是一个事务,我就当它是复杂的业务操作.

    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速度快....所以我们更应该面向接口去编程,让细节依赖于接口,实现解耦.

    IDAL这个类运用面向对象的知识点,还可以进行简化,仔细观察假设我们有100张表的DAL,你会发现除了每个类对应的model不一样,其它的都是一模一样,这个时候就可以运用泛型进行提取,如

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

    这样100个类只用写一个类就可以了

    DAL层,数据访问层

    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...根据个人喜好了,同理这个类也能提取

    BLL业务逻辑层

     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的生命周期,这里我附上我学习时候的一张图

    详细的可以去看丹尼大叔的博客NHibernate系列文章七:NHibernate对象状态 写的非常详细了,我这里就不过多说明了

  • 相关阅读:
    AQS共享锁应用之Semaphore原理
    AQS与重入锁ReetrantLock原理
    2018第23周总结
    阅读思考——被误用的敏捷和阻碍程序员成长的坏习惯
    百度云盘下载工具
    线程中断总结
    JUC包中的锁框架
    Java并发实现线程阻塞原语LockSupport
    react的类型检查PropTypes自React v15.5起已弃用,请使用prop-types
    python性能优化、内存优化、内存泄露;与其他语音比较效率如何?
  • 原文地址:https://www.cnblogs.com/tibos/p/6202710.html
Copyright © 2011-2022 走看看