本人以前写程序都是瞎写,根本没有啥模式也没有啥方法。

近一年来学习了传智的一些课程,感觉马伦老师很有才,很强大,所以学来了一个模式(应当叫模式吧,该我也不知道叫啥哈)。

就是在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之我见的更多相关文章

  1. MVVM、MVVMLight、MVVMLight Toolkit之我见

    原文:MVVM.MVVMLight.MVVMLight Toolkit之我见 我想,现在已经有不少朋友在项目中使用了MVVMLight了吧,如果你正在做WPF,Silverlight,Windows ...

  2. ABP(现代ASP.NET样板开发框架)系列之12、ABP领域层——工作单元(Unit Of work)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之12.ABP领域层——工作单元(Unit Of work) ABP是“ASP.NET Boilerplate Pr ...

  3. ABP源码分析十:Unit Of Work

    ABP以AOP的方式实现UnitOfWork功能.通过UnitOfWorkRegistrar将UnitOfWorkInterceptor在某个类被注册到IOCContainner的时候,一并添加到该类 ...

  4. 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 ...

  5. VS2012 Unit Test 个人学习汇总(含目录)

    首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualStudio.TestTools.UnitTesting.a ...

  6. VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式

    [1]我的IdleTest源码地址:http://idletest.codeplex.com/ [2]IdleTest改动说明:2013年10月份在保持原有功能的情况下对其动了较大的手术,首先将基本的 ...

  7. VS2012 Unit Test——Microsoft Fakes入门

    如题,本文主要作为在VS2012使用Fakes的入门示例,开发工具必须是VS2012或更高版本. 关于Fakes的MSDN地址:http://msdn.microsoft.com/en-us/libr ...

  8. MTU(Maximum transmission unit) 最大传输单元

    最大传输单元(Maximum transmission unit),以太网MTU为1500. 不同网络MTU如下: 如果最大报文数据大小(MSS)超过MTU,则会引起分片操作.   路径MTU: 网路 ...

  9. Simulink Memory vs Unit Delay

    Memoryブロック.Unit Delayブロック共に前回の入力値を出力しますが.動作するタイミングが異なります. ●Memoryブロック シミュレーションの各時刻(ステップ)で動作し.「1ステップ」 ...

随机推荐

  1. php获取音悦台视频

    <?php $url=isset($_GET['url'])?trim($_GET['url']):''; $url = "http://v.yinyuetai.com/video/6 ...

  2. FTP基本操作类大全,外加c#基础公共帮助类

    总结平时用到的一些FTP操作类,方便需要的用到.github地址:https://github.com/Jimmey-Jiang/Common.Utility 1.连接FTP服务器 /// <s ...

  3. (转)TabIndex 属性

    html中的tabIndex属性可以设置键盘中的TAB键在控件中的移动顺序,即焦点的顺序.   把控件的tabIndex属性设成1到32767的一个值,就可以把这个控件加入到TAB键的序列中.   这 ...

  4. MVC中重写RoleProvider角色管理

    /* 数据表SQL脚本 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_UsersInRoles_Ro ...

  5. winwebmail设置能用foxmail收发邮件

    域名解析注意 1.首先做A记录解析: 主机名处:输入 mail IP地址处:输入IP地址 2.做MX记录: 主机名处: 大都保持空输入,什么也不用输入   TTL:默认就可以了,不需要改动 优先级:一 ...

  6. WPF DataGrid自定义样式

    微软的WPF DataGrid中有很多的属性和样式,你可以调整,以寻找合适的(如果你是一名设计师).下面,找到我的小抄造型的网格.它不是100%全面,但它可以让你走得很远,有一些非常有用的技巧和陷阱. ...

  7. 发布系统Git使用指南 - the Git Way to Use Git

    发布系统Git使用指南 --the Git Way to Use Git 背景 ​ 有文章曾归纳,Git是一套内容寻址文件系统,意思是,Git的核心是存储键值对^[1]^.显然,这样的形式不利于普通人 ...

  8. 读Zepto源码之Stack模块

    Stack 模块为 Zepto 添加了 addSelf 和 end 方法. 读 Zepto 源码系列文章已经放到了github上,欢迎star: reading-zepto 源码版本 本文阅读的源码为 ...

  9. DevOps之内容分发网络CDN

    唠叨话 关于德语噢屁事的知识点,仅提供专业性的精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <内容分发网络CDN(Content Delivery Network)> 关于虚 ...

  10. JS全选与不选、反选

    思路: 1.获取元素. 2.用for循环历遍数组,把checkbox的checked设置为true即实现全选,把checkbox的checked设置为false即实现不选. 3.通过if判断,如果ch ...