LSJ_NHibernate第三章 IDAL,DAL,BLL
前言:
做项目(面向数据编程),首先必须了解业务,这是核心,不懂业务写出来的代码毫无意义.业务我这里分为两种,简单业务操作,复杂业务操作,我以他们操作表的界限进行区分,假设我更新一条数据,只操作了一张表,我就把它当作一个简单的业务操作,假设用户购买产品这个操作,业务执行过程中,我必须修改用户表,订单表....操作了多张表,且这是一个事务,我就当它是复杂的业务操作.
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的更多相关文章
- .NET中 DAL+IDAL+Model+BLL+Web是什么意思
在.NET中 DAL+IDAL+Model+BLL+Web是什么意思 http://hi.baidu.com/hexiaojian/item/8d0c1a8e648546d75e0ec1e7 其实三层 ...
- 用T4生成EF框架下的DAL、IDAL、BLL、IBLL
(一)什么是T4模板? T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit. T4文本模板,即一种自定义规则的代码生成器.根据业务模型可生成任何 ...
- ASP.NET的三层架构(DAL,BLL,UI)
ASP.NET的三层架构(DAL,BLL,UI) BLL 是业务逻辑层 Business Logic Layer DAL 是数据访问层 Data Access Laye ...
- MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理
目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...
- Pro ASP.NET Core MVC 6th 第三章
第三章 MVC 模式,项目和约定 在深入了解ASP.NET Core MVC的细节之前,我想确保您熟悉MVC设计模式背后的思路以及将其转换为ASP.NET Core MVC项目的方式. 您可能已经了解 ...
- 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...
- 《Linux内核设计与实现》读书笔记 第三章 进程管理
第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种.我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在. 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于 ...
- Python黑帽编程3.0 第三章 网络接口层攻击基础知识
3.0 第三章 网络接口层攻击基础知识 首先还是要提醒各位同学,在学习本章之前,请认真的学习TCP/IP体系结构的相关知识,本系列教程在这方面只会浅尝辄止. 本节简单概述下OSI七层模型和TCP/IP ...
- 《Entity Framework 6 Recipes》中文翻译系列 (11) -----第三章 查询之异步查询
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...
随机推荐
- HTML特殊字符大全
特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 ! ! " " " # # $ $ % % & & & ' ...
- Git分支管理的基本操作
首先从远端版本库clone下来一个全新的库: git clone username@xxx:/xxx/xxx.git 此时clone下来的,只是master分支,没有其他分支. 查看分支: git b ...
- 在内部架设NuGet服务器
在公司内部有很多基础框架或者基础组件,甚至对于使用SOA架构的公司来说,会有大量的业务组件的契约程序集,对于这些框架或组件的引用管理有的人使用源代码管理工具,但是NuGet相比源代码管理工具更方便: ...
- 【原】Spark中Stage的提交源码解读
版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Job如何划分为Stage http://www.cnblogs.com/yourarebest/p/5342424.html 1 ...
- PHP字符串操作常用函数
/* * 确定字符串长度 * int strlen(string str) * 比较两个字符串 * 1.strcmp函数对两个字符串进行二进制安全的比较,并区分大小写 * int strcmp(str ...
- localtime和localtime_r
上程序: #include <cstdlib> #include <iostream> #include <time.h> #include <stdio.h ...
- POJ2689 - Prime Distance(素数筛选)
题目大意 给定两个数L和U,要求你求出在区间[L, U] 内所有素数中,相邻两个素数差值最小的两个素数C1和C2以及相邻两个素数差值最大的两个素数D1和D2,并且L-U<1,000,000 题解 ...
- Duff and Weight Lifting - 587A
题目大意:某个人训练举重,他每次可以举起来2^wi的重量,不过这个人比较懒所以他想尽量减少训练的次数,如果所有的训练重量2^a1 +2^a2+....2^ak = 2^x,那么这些重量可以一次性训练( ...
- 工作7年,从《一个苏州IT人的5年挨踢经历》系列开始,博客1年半,纯纪念
真正涉足CSDN,还是从<一个苏州IT人的5年挨踢经历>系列的发帖开始,当时大家比较捧场,遂把帖子内容整理,其后创建CSDN博客并发表于其上.有了这个开端,后续就习惯性的开始在CSDN写技 ...
- var_dump() 打印数组不完整 解决办法
我们用var_dump() 打印数组, 一般会出现这种情况, 就是打印出来的数组不完整 ,会有省略号. 解决方法: 在php.ini里的xdebug节点中,加入如下 xdebug.var_displa ...