回到目录

第一讲 认识IUnitOfWork,为什么要出现IUnitOfWork接口
第二讲 Linq to Sql与EntityFrameworks中的SubmtChanges()发生了什么事
第三讲 方法完整性与统一提交不冲突
第四讲 DbContext对象的创建应该向BLL层公开
第五讲 我的IUnitOfWork+Repository架构

在EF中,数据上下文通常是DbContext或者ObjectContext,而在linq to sql中数据上下文则是DataContext,它们的作用是建立一个数据库映射对象ORM,以更加方便的操作数据库,而它们的创建工作,我在很长一段时间将它约束在DAL层,对BLL层不公开创建方法,但当我对.net了解更多之后,觉得将数据上下文的创建工作公开到BLL层是很有必要的,最起码在程序性能上及原子化操作上很有必要。

原来我们在BLL层调用一个添加操作时,需要在DAL层先去定义这个实现,即使这个实体只存在一个添加操作,你也要去实现一下,这无疑加大了代码量,像这样:

 public class ProductRepository : TestBase<Product>{#region Constructorspublic ProductRepository() { }public ProductRepository(IUnitOfWork db) : base((TestDataContext)db) { }#endregion/// <summary>/// 一个方法,也要建立这个repository,有点坏味道/// </summary>/// <param name="entity"></param>public override void Insert(Product entity){base.Insert(entity);}}

而,如果我们将数据上下文创建的工作公开到BLL层,那结果就不一样了,再配合IUnitOfWork思想,实现在BLL层对DAL方法的整合,实现向数据库发送一次连接请求,这种感觉,酷D了,呵呵。

public abstract class BLLBase{protected IUnitOfWork IUnitOfWork { get; private set; }public BLLBase(): this(null){}public BLLBase(IUnitOfWork iUnitOfWork){IUnitOfWork = iUnitOfWork;}protected ICompleteRepository<T> LoadRepository<T>() where T : class{return IUnitOfWork == null ? new TestBase<T>() : new TestBase<T>(IUnitOfWork);}}

对于BLL层的祖宗,呵呵,BLLBas,它将数据上下文的创建工作在架造方法中注入,然后传递给LoadRepository这generic method,在BLL层的业务类中可以

继承它并为数据上下文进行实例化,再使用LoadRepository直接对数据表进行CURD操作,一切就是这样简单,看代码:

         #region BLLBase中直接调用公用方法IUnitOfWork.IsNotSubmit = true;new OrderRepository(IUnitOfWork).Insert(order);if (product != null)LoadRepository<Product>().Insert(product);IUnitOfWork.SaveChanges();#endregion

OK,UI层直接调用BLL层的具体业务方法即可,下面我们再来看一个我DAL层的类结构,有时,我越得类结构图比代码更能说明问题:

CURD操作规范:

DAL层Repository模式实现:

IUnitOfWork工作单元规范:

回到目录

转载于:https://www.cnblogs.com/lori/archive/2013/03/19/2970203.html

说说IUnitOfWork~DbContext对象的创建应该向BLL层公开相关推荐

  1. java初始化实例化_Java对象的创建过程:类的初始化与实例化

    一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...

  2. 我翻译的一篇文章,OO设计中对象的创建和使用

    OO设计中对象的创建和使用 转载于:https://www.cnblogs.com/lishu1980/archive/2006/06/22/432526.html

  3. 【MATLAB】符号数学计算(一):符号对象的创建

    一.符号对象的创建命令 1.函数命令sym( ) variable=sym(A,flag) S=sym('A',flag) 如果A是(不带单引号)是一个数字.数值矩阵或者数值表达式,则输出结果是将数值 ...

  4. java对象的访问定位_2、JVM-Java对象的创建、对象结构、对象访问定位-Go语言中文社区...

    目录 记录下来方便个人学习复习 注:根据new的参数在常量池中定位一个类的符号引用 --这句话的意思是:常量池相当于c语言中的指针地址集合,所以就是在常量池中保存new对象的地址,通过地址定位对象在堆 ...

  5. 关于 automation服务器对象不能创建

    好不容易费尽心思找到一段代码是通过JS获取word文档的页码数量,在测试的过程中正常.但是一旦加入正式使用页面中就提示"automation服务器 对象不能创建",开始是以为JS多 ...

  6. javascript笔记:深入分析javascript里对象的创建(上)续篇

    今天回来一看我的博客居然有这么多人推荐真是开心极了,看来大家对我的研究有了认可,写博客的动力越来越大了,而且我发现写javascript在博客园里比较受欢迎,写java的受众似乎少多了,可能博客园里j ...

  7. HotSpot虚拟机对象的创建过程

    1.文中讨论的对象限于普通Java对象,不包括数组和class对象. 2.内存的分配方式由Java堆是否规整来决定,而Java堆是否规整取决于垃圾收集器是否有压缩整理的功能. 3.还需要考虑:对象的创 ...

  8. 转 cocos2d-x 3.0 常用对象的创建方式

    cocos2d-x 3.0 中所有对象几乎都可以用create函数来创建,其他的创建方式也是有create函数衍生. 下面来介绍下create函数创建一般对象的方法,省得开发中经常忘记啥的. 1.精灵 ...

  9. Java对象的创建、内存布局和访问定位

    在Java运行时数据区中,我们知道了虚拟机内存的概况,本文介绍虚拟机内存中的数据的其它细节,如对象如何创建.如何布局以及如何访问. 基于实用的原则,这里以HotSpot虚拟机和常用的内存区域Java堆 ...

  10. 041_对象的创建和销毁

    1. 对象的创建和销毁都在JavaScript执行过程中发生, 理解这种方式的含义对理解整个语言至关重要. 2. 声明和实例化 2.1. 对象的创建方式是用关键字new后面跟上实例化的类的名字: va ...

最新文章

  1. 大家对协同管理软件是怎么理解的?协同管理软件最主要需要解决企业/组织什么问题?
  2. common pool2 mysql_连接池Commons Pool2的使用
  3. 《0 bug ---- C/C++商用工程之道》目录
  4. JAVA Socket 底层是怎样基于TCP/IP 实现的???
  5. 【HTML+CSS】(2)CSS Sprite雪碧图
  6. javeWeb springMvc获取到的参数附带特殊符号,接收后被转义
  7. Struts2教程3:struts.xml常用配置解析
  8. CF1169(div2)题解报告
  9. php dom 分离html内容
  10. 数据结构——c语言 队列杨辉三角
  11. 微信开发者工具的使用
  12. 正则表达式(18)——字符串替换案例:UBB翻译
  13. 解决系统提示:内存不能为“read”或written的办法
  14. 【SAP-SD】合同与发运协议的区别
  15. [思语]_心上人,我想对你说
  16. sql判断整除_SQL操作符/运算符
  17. PLSQL 常用语句
  18. C语言,输入一个年份,判断是不是闰年。
  19. 认证服务:整合短信验证码
  20. 《C++》第1章——第111章

热门文章

  1. 揭秘全球第二大基金公司:先锋基金70人投资团队掌管2万亿美元股票资产
  2. (转)敲黑板:IT项目出现问题,足以拖垮整个公司
  3. Rust : Box 为什么这里并不需要拆箱?
  4. 做了 7 年开源数据库开发,我学到了什么?
  5. 回顾2019,展望2020
  6. Intel® QAT 助力Nginx压缩处理
  7. 【特征提取】基于matlab一帧语音共振峰提取【含Matlab源码 1768期】
  8. 【手势识别】基于matlab GUI石头剪刀布【含Matlab源码 774期】
  9. 【图像分割】基于matlab GUI类间方差阈值图像分割【含Matlab源码 583期】
  10. 【雷达通信】基于matlab GUI雷达定位【含Matlab源码 302期】