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

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

就是在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. 学习如何看懂SQL Server执行计划(三)——连接查询篇

    三.连接查询部分 --------------------嵌套循环-------------------- /* UserInfo表数据少.Coupon表数据多嵌套循环可以理解为就是两层For循环,外 ...

  2. Mysql安装后打开MySQL Command Line Client闪退解决方法

    1.开始菜单下;Mysql--->mysql server 5.6-->mysql command line Client ---右击,选择属性 2.在属性下查看目标位置: 3.将安装目录 ...

  3. JAVA提高四:反射基本应用

    在前面一节<http://www.cnblogs.com/pony1223/p/7659210.html>,我们学习了JAVA的反射的相关知识,那么本节我们对前面所学习的知识做一个应用相关 ...

  4. HTTP错误代码大全

    HTTP出错大全 101 - Switching Protocols Top Success Codes 200 - OK201 - Created202 - Accepted203 - Non-Au ...

  5. 面试题:Two Sum

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  6. vim 自动在操作符 前后加上空格 C语言

    function! Align_Space() let current_line = getline('.') let replacement = substitute(current_line,'\ ...

  7. git 分支改名

    给一个git分支改名的方法很简单 如果对于分支不是当前分支,可以使用下面代码: git branch -m 原名 新 如果是当前,那么可以使用加上新名字 git branch -m 原名 参见: ht ...

  8. 多线程之Map:Hashtable HashMap 以及ConcurrentHashMap

    1.Map体系参考:http://java.chinaitlab.com/line/914247.htmlHashtable是JDK 5之前Map唯一线程安全的内置实现(Collections.syn ...

  9. Node.js之异步流控制

    前言 在没有深度使用函数回调的经验的时候,去看这些内容还是有一点吃力的.由于Node.js独特的异步特性,才出现了"回调地狱"的问题,这篇文章中,我比较详细的记录了如何解决异步流问 ...

  10. SPARK 创建新任务

    1.应用程序创建 SparkContext 的实例 sc 2.利用 SparkContext 的实例来创建生成 RDD 3.经过一连串的 transformation 操作,原始的 RDD 转换成为其 ...