Unit Of Work之我见
本人以前写程序都是瞎写,根本没有啥模式也没有啥方法。
近一年来学习了传智的一些课程,感觉马伦老师很有才,很强大,所以学来了一个模式(应当叫模式吧,该我也不知道叫啥哈)。
就是在DAL层封装一个DbSession来为BLL提供访问统一入口:
public partial interface IDbSession
{
ObjectContext DbContext { get; } //上下文对象
int ExcuteSql(string sql, params ObjectParameter[] parameters); //可以直接执行SQL语句
int SaveChanges(); //统一提交更改
}
这样来实现:
public partial class DbSession:IDbSession
{ public System.Data.Objects.ObjectContext DbContext
{
//这里用了一个工厂来取得DbContext,当时为了方便注入
get { return DbContextFactory.GetCurrentDbContext(); }
} public int ExcuteSql(string sql, params System.Data.Objects.ObjectParameter[] parameters)
{
return DbContext.ExecuteFunction(sql, parameters);
} public int SaveChanges()
{
return DbContext.SaveChanges();
} }
使用时DAL层全部返回true,是否有问题交给BLL来处理
public class BaseRepository<T> : IBaseRepository<T> where T : class,new()
{
private readonly ObjectContext _db = DbContextFactory.GetCurrentDbContext(); public bool AddEntities(ICollection<T> entities)
{
foreach (var entity in entities)
{
AddEntity(entity);
}
return true;
}
}
public class BaseService<T> : IBaseService<T> where T : class,new()
{
..... public bool AddEntities(ICollection<T> entities)
{
CurrentRepository.AddEntities(entities);
return TryToSave();
} private bool TryToSave()
{
try
{
CurrentDbSession.SaveChanges();
return true;
}
catch (Exception)
{
return false;
}
}
}
这样,可以多次提交,只有在需要的时候,统一发送到数据库,可以算上Unit Of Work了。
但今天又发现一个好东西,可以再加一个事务进去,其实本身EF就会做事务处理了,但为了好扩展,自己加一个更好些,改造下接口:
记得添加System.Transactions引用并Using
public partial interface IDbSession
{
ObjectContext DbContext { get; }
int ExcuteSql(string sql, params ObjectParameter[] parameters);
//执行事务
TransactionScope CreateTransaction(IsolationLevel isolationLevel, int timeoutInSeconds);
int SaveChanges();
}
实现它:
public partial class DbSession:IDbSession
{ public System.Data.Objects.ObjectContext DbContext
{
get { return DbContextFactory.GetCurrentDbContext(); }
} public int ExcuteSql(string sql, params System.Data.Objects.ObjectParameter[] parameters)
{
return DbContext.ExecuteFunction(sql, parameters);
} public int SaveChanges()
{
return DbContext.SaveChanges();
} //执行事务(级别,超时时间)
public TransactionScope CreateTransaction(IsolationLevel isolationLevel, int timeoutInSeconds)
{
var option = TransactionScopeOption.Required;
var options = new TransactionOptions
{
IsolationLevel = isolationLevel,
Timeout = new TimeSpan(, , timeoutInSeconds)
};
return new TransactionScope(option, options);
}
}
这回可以这样调用了:
if (isAddNew)
{
using (var scope = dbSession.CreateTransaction(System.Transactions.IsolationLevel.ReadCommitted, ))
{
.... dbSession.SaveChanges(); ..... dbSession.SaveChanges();
scope.Complete();
}
}
说的语无伦次,仅作笔记 ^^
Unit Of Work之我见的更多相关文章
- MVVM、MVVMLight、MVVMLight Toolkit之我见
原文:MVVM.MVVMLight.MVVMLight Toolkit之我见 我想,现在已经有不少朋友在项目中使用了MVVMLight了吧,如果你正在做WPF,Silverlight,Windows ...
- ABP(现代ASP.NET样板开发框架)系列之12、ABP领域层——工作单元(Unit Of work)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之12.ABP领域层——工作单元(Unit Of work) ABP是“ASP.NET Boilerplate Pr ...
- ABP源码分析十:Unit Of Work
ABP以AOP的方式实现UnitOfWork功能.通过UnitOfWorkRegistrar将UnitOfWorkInterceptor在某个类被注册到IOCContainner的时候,一并添加到该类 ...
- Failed to stop iptables.service: Unit iptables.service not loaded.
redhat 7 [root@lk0 ~]# service iptables stop Redirecting to /bin/systemctl stop iptables.service Fai ...
- VS2012 Unit Test 个人学习汇总(含目录)
首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualStudio.TestTools.UnitTesting.a ...
- VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式
[1]我的IdleTest源码地址:http://idletest.codeplex.com/ [2]IdleTest改动说明:2013年10月份在保持原有功能的情况下对其动了较大的手术,首先将基本的 ...
- VS2012 Unit Test——Microsoft Fakes入门
如题,本文主要作为在VS2012使用Fakes的入门示例,开发工具必须是VS2012或更高版本. 关于Fakes的MSDN地址:http://msdn.microsoft.com/en-us/libr ...
- MTU(Maximum transmission unit) 最大传输单元
最大传输单元(Maximum transmission unit),以太网MTU为1500. 不同网络MTU如下: 如果最大报文数据大小(MSS)超过MTU,则会引起分片操作. 路径MTU: 网路 ...
- Simulink Memory vs Unit Delay
Memoryブロック.Unit Delayブロック共に前回の入力値を出力しますが.動作するタイミングが異なります. ●Memoryブロック シミュレーションの各時刻(ステップ)で動作し.「1ステップ」 ...
随机推荐
- 简单Elixir游戏服设计- 创建项目
反正是写到哪算哪. 创建umbrella项目 mix new simple_game --umbrella 创建model项目 cd simple_game\apps mix new model 创建 ...
- #云栖大会# 移动安全专场——APP加固新方向(演讲速记)
主持人导语: 近些年来,移动APP数量呈现爆炸式的增长,黑产也从原来的PC端转移到了移动端,伴随而来的逆向攻击手段也越来越高明.在解决加固产品容易被脱壳的方案中,代码混淆技术是对抗逆向攻击最有效的方式 ...
- MVVM 模版里的控件怎样触发命令
public class BaseWindow : Window { public BaseWindow() { InitializeStyle(); //给样式的控件加载事件 this.Loaded ...
- Linux用户角色划分
在Linux系统中,用户是分角色的,角色不同,对应权限不同.用户角色通过UID和GID识别. 大致分为三种:超级用户,普通用户,虚拟用户. 超级用户:默认是root用户,其UID和GID都是0.roo ...
- jquery层次选择器:空格 > next + nextAll ~ siblings
全栈工程师开发手册 (作者:栾鹏) jquery系列教程1-选择器全解 jquery层次选择器 jquery层次选择器,包括空格.>.next.+.nextAll.~.siblings等函数或表 ...
- jquery基本选择器:id选择器、class选择器、标签选择器、通配符选择器
全栈工程师开发手册 (作者:栾鹏) jquery系列教程1-选择器全解 jquery基本选择器 jquery基本选择器,包括id选择器.class选择器.标签选择器.通配符选择器,同时配合选择器的空格 ...
- CoreData和SQLite多线程访问时的线程安全问题
数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常用的两种数据持久化存储方式:CoreData和SQLite,两 ...
- android6.0 SerialPort 服务
上一篇博客描述了一个简单的串口应用程序和驱动程序,了解了应用程序访问串口的基本操作,如打开串口,设置串口,写串口,读串口,关闭串口等.和Linux串口驱动的基本框架.这里将了解Android下的串口系 ...
- 阻塞IO
服务端 from socket import * server = socket(AF_INET,SOCK_STREAM) server.bind(('127.0.0.1',8080)) server ...
- Windows下Mysql5.7开启binlog步骤及注意事项
1.查看是否开启了binlog:show binary logs; 默认情况下是不开启的. 2.开启binlog:修改mysql的配置文件my.ini.添加如下配置: 该文件默认不允许修改,需要右键“ ...