前言:

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

IDAL层,数据库操作接口层,定义所有的简单业务操作接口,代码如下

 namespace DAO.IDAL {
/// <summary>
/// 接口层D_News
/// </summary>
public interface INews
{
#region 成员方法
/// <summary>
/// 是否存在该记录
/// </summary>
bool Exists(object id);
/// <summary>
/// 增加一条数据
/// </summary>
object Save(News model);
/// <summary>
/// 更新一条数据
/// </summary>
void Update(News model);
/// <summary>
/// 删除数据
/// </summary>
void Delete(object id);
/// <summary>
/// 删除数据
/// </summary>
void Delete(News model);
/// <summary>
/// 得到一个对象实体
/// </summary>
News Get(object id);
/// <summary>
/// 获得数据列表
/// </summary>
IList<News> LoadAll();
/// <summary>
/// 获得前几行数据
/// </summary>
IList<News> GetList(List<SearchTemplate> st, List<Order> order); /// <summary>
/// 获得总条数
/// </summary>
int GetCount(List<SearchTemplate> st);
#endregion 成员方法
}
}

我将这些简单业务操作抽象出来,这里用到IOC(控制反转)的原理,数据访问层不依赖于业务访问层,而依赖于接口,业务访问层的简单业务操作依赖于接口,这样就能实现业务与数据访问的解耦,简单来说你可以写N个数据访问层,只要实现接口即可,可能这里又有人不理解了,我写一个数据访问层就够累了,还写多个那不是有病吗?那是因为考虑的项目都比较的小,假设要做一个企业级大项目,有1000张表,分配给10个人完成,有些人觉得EF好用,有些觉得手写SQL速度快....所以我们更应该面向接口去编程,让细节依赖于接口,实现解耦.

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

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

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

DAL层,数据访问层

      public IList<News> LoadAll()
{
using (ISession session = sessionFactory.OpenSession())
{
return session.QueryOver<News>().List();
}
}
 public IList<News>  GetList(List<SearchTemplate> st, List<Order> order)
{
using (ISession session = sessionFactory.OpenSession())
{
ICriteria crit = session.CreateCriteria(typeof(News));
IList<News> customers = ManagerPage.GetCrit<News>(st, order, crit);
return customers;
}
}

这里我调用NHibernate提供的接口进行数据访问操作即可,比如QueryOver,ICriteria...根据个人喜好了,同理这个类也能提取

BLL业务逻辑层

     public partial class B_News
{
private readonly INews dal = new D_News();
public B_News()
{} #region Method
public IList<Domain.News> GetList(List<SearchTemplate> st, List<Order> order)
{
return dal.GetList(st, order);
} public int GetCount(List<SearchTemplate> st)
{
return dal.GetCount(st);
} public int Save(Domain.News model)
{
return Convert.ToInt32(dal.Save(model));
} public Domain.News Get(object id)
{
return dal.Get(id);
} public void Delete(object id)
{
dal.Delete(id);
} public void Update(Domain.News model)
{
dal.Update(model);
}
#endregion }

这里的简单业务操作也可以用泛型进行提取,复杂的业务操作必须手写了,写之前请先熟悉NHibernate的生命周期,这里我附上我学习时候的一张图

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

LSJ_NHibernate第三章 IDAL,DAL,BLL的更多相关文章

  1. .NET中 DAL+IDAL+Model+BLL+Web是什么意思

    在.NET中 DAL+IDAL+Model+BLL+Web是什么意思 http://hi.baidu.com/hexiaojian/item/8d0c1a8e648546d75e0ec1e7 其实三层 ...

  2. 用T4生成EF框架下的DAL、IDAL、BLL、IBLL

    (一)什么是T4模板? T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit. T4文本模板,即一种自定义规则的代码生成器.根据业务模型可生成任何 ...

  3. ASP.NET的三层架构(DAL,BLL,UI)

    ASP.NET的三层架构(DAL,BLL,UI) BLL   是业务逻辑层   Business   Logic   Layer DAL   是数据访问层   Data   Access   Laye ...

  4. MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

  5. Pro ASP.NET Core MVC 6th 第三章

    第三章 MVC 模式,项目和约定 在深入了解ASP.NET Core MVC的细节之前,我想确保您熟悉MVC设计模式背后的思路以及将其转换为ASP.NET Core MVC项目的方式. 您可能已经了解 ...

  6. 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...

  7. 《Linux内核设计与实现》读书笔记 第三章 进程管理

    第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种.我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在. 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于 ...

  8. Python黑帽编程3.0 第三章 网络接口层攻击基础知识

    3.0 第三章 网络接口层攻击基础知识 首先还是要提醒各位同学,在学习本章之前,请认真的学习TCP/IP体系结构的相关知识,本系列教程在这方面只会浅尝辄止. 本节简单概述下OSI七层模型和TCP/IP ...

  9. 《Entity Framework 6 Recipes》中文翻译系列 (11) -----第三章 查询之异步查询

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...

随机推荐

  1. MongoDB实战开发 【零基础学习,附完整Asp.net示例】

    MongoDB实战开发 [零基础学习,附完整Asp.net示例] 阅读目录 开始 下载MongoDB,并启动它 在C#使用MongoDB 重构(简化)代码 使用MongoDB的客户端查看数据 使用Mo ...

  2. Growling Gears

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11587 G Growling GearsThe Best A ...

  3. SAE网站搭建(1)

    用了半天时间,把Django的基本结构同步到SAE上了,里边比较麻烦的地方如下: 1. 数据库的同步; SAE用的是SQL数据库,默认使用下面的用户名.密码等变量(SAE为我们做了很多工作) 首先需要 ...

  4. JSP---演示ErroPage、isErroPage和jsp:forword标签

    属性说明: language – 示例:language="java" import -如: (注意多个引用之间使用逗号分开.) <%@ page import=" ...

  5. Visual Studio 2013中的新项目对话框

    在Visual Studio 2013,我们推出了添加新的项目对话框. 此对话框取代了是曾在2012年这个的对话框作品,所有ASP.NET项目(MVC,Web窗体和Web API). 这就是我们如何提 ...

  6. 拉普拉斯特征图降维及其python实现

    这种方法假设样本点在光滑的流形上,这一方法的计算数据的低维表达,局部近邻信息被最优的保存.以这种方式,可以得到一个能反映流形的几何结构的解. 步骤一:构建一个图G=(V,E),其中V={vi,i=1, ...

  7. Spring ’14 Wave Update: Installing Dynamics CRM on Tablets for Windows 8.1

    One of the added bonuses of Dynamics CRM is its ability go where you go! With the Spring ’14 Wave Up ...

  8. 2016/9/7 jdbc.properties配置数据库相关

    ##MySQL#jdbc.driver=com.mysql.jdbc.Driver#jdbc.url=jdbc:mysql://localhost:3306/test#jdbc.username=ro ...

  9. 【转】Java Thread.join()详解

    http://www.open-open.com/lib/view/open1371741636171.html 一.使用方式. join是Thread类的一个方法,启动线程后直接调用,例如: ? 1 ...

  10. invoke-command

    远程执行命令: invoke-command -ComputerName $server -Credential $cred -ScriptBlock{param($server,$UserName, ...