说说IUnitOfWork~DbContext对象的创建应该向BLL层公开
回到目录
第一讲 认识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层公开相关推荐
- java初始化实例化_Java对象的创建过程:类的初始化与实例化
一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...
- 我翻译的一篇文章,OO设计中对象的创建和使用
OO设计中对象的创建和使用 转载于:https://www.cnblogs.com/lishu1980/archive/2006/06/22/432526.html
- 【MATLAB】符号数学计算(一):符号对象的创建
一.符号对象的创建命令 1.函数命令sym( ) variable=sym(A,flag) S=sym('A',flag) 如果A是(不带单引号)是一个数字.数值矩阵或者数值表达式,则输出结果是将数值 ...
- java对象的访问定位_2、JVM-Java对象的创建、对象结构、对象访问定位-Go语言中文社区...
目录 记录下来方便个人学习复习 注:根据new的参数在常量池中定位一个类的符号引用 --这句话的意思是:常量池相当于c语言中的指针地址集合,所以就是在常量池中保存new对象的地址,通过地址定位对象在堆 ...
- 关于 automation服务器对象不能创建
好不容易费尽心思找到一段代码是通过JS获取word文档的页码数量,在测试的过程中正常.但是一旦加入正式使用页面中就提示"automation服务器 对象不能创建",开始是以为JS多 ...
- javascript笔记:深入分析javascript里对象的创建(上)续篇
今天回来一看我的博客居然有这么多人推荐真是开心极了,看来大家对我的研究有了认可,写博客的动力越来越大了,而且我发现写javascript在博客园里比较受欢迎,写java的受众似乎少多了,可能博客园里j ...
- HotSpot虚拟机对象的创建过程
1.文中讨论的对象限于普通Java对象,不包括数组和class对象. 2.内存的分配方式由Java堆是否规整来决定,而Java堆是否规整取决于垃圾收集器是否有压缩整理的功能. 3.还需要考虑:对象的创 ...
- 转 cocos2d-x 3.0 常用对象的创建方式
cocos2d-x 3.0 中所有对象几乎都可以用create函数来创建,其他的创建方式也是有create函数衍生. 下面来介绍下create函数创建一般对象的方法,省得开发中经常忘记啥的. 1.精灵 ...
- Java对象的创建、内存布局和访问定位
在Java运行时数据区中,我们知道了虚拟机内存的概况,本文介绍虚拟机内存中的数据的其它细节,如对象如何创建.如何布局以及如何访问. 基于实用的原则,这里以HotSpot虚拟机和常用的内存区域Java堆 ...
- 041_对象的创建和销毁
1. 对象的创建和销毁都在JavaScript执行过程中发生, 理解这种方式的含义对理解整个语言至关重要. 2. 声明和实例化 2.1. 对象的创建方式是用关键字new后面跟上实例化的类的名字: va ...
最新文章
- 大家对协同管理软件是怎么理解的?协同管理软件最主要需要解决企业/组织什么问题?
- common pool2 mysql_连接池Commons Pool2的使用
- 《0 bug ---- C/C++商用工程之道》目录
- JAVA Socket 底层是怎样基于TCP/IP 实现的???
- 【HTML+CSS】(2)CSS Sprite雪碧图
- javeWeb springMvc获取到的参数附带特殊符号,接收后被转义
- Struts2教程3:struts.xml常用配置解析
- CF1169(div2)题解报告
- php dom 分离html内容
- 数据结构——c语言 队列杨辉三角
- 微信开发者工具的使用
- 正则表达式(18)——字符串替换案例:UBB翻译
- 解决系统提示:内存不能为“read”或written的办法
- 【SAP-SD】合同与发运协议的区别
- [思语]_心上人,我想对你说
- sql判断整除_SQL操作符/运算符
- PLSQL 常用语句
- C语言,输入一个年份,判断是不是闰年。
- 认证服务:整合短信验证码
- 《C++》第1章——第111章
热门文章
- 揭秘全球第二大基金公司:先锋基金70人投资团队掌管2万亿美元股票资产
- (转)敲黑板:IT项目出现问题,足以拖垮整个公司
- Rust : Box 为什么这里并不需要拆箱?
- 做了 7 年开源数据库开发,我学到了什么?
- 回顾2019,展望2020
- Intel® QAT 助力Nginx压缩处理
- 【特征提取】基于matlab一帧语音共振峰提取【含Matlab源码 1768期】
- 【手势识别】基于matlab GUI石头剪刀布【含Matlab源码 774期】
- 【图像分割】基于matlab GUI类间方差阈值图像分割【含Matlab源码 583期】
- 【雷达通信】基于matlab GUI雷达定位【含Matlab源码 302期】