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

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

就是在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. 简单Elixir游戏服设计- 游戏玩法介绍

    抄以前的,做了点修改. 到目前为止,我们完成了玩家的数据和进程建模,现在介绍游戏玩法. 为什么我们还不做客户端接入.协议指定呢?为什么还没有网关和数据存储呢.在我接手的游戏, 这些通常已经定下来了,我 ...

  2. SpringMVC加载.roperties文件属性值的方法?

    1.在xml文件中引入来获取属性值就不说了. 2.在controller层获取引用配置文件中的属性值: (1).编写工具类 @Configuration @PropertySource(value=& ...

  3. vue2购物车ch4-(筛选v-for 点击的那个设置样式 设为默认地址其他 联动 非循环的列表选中和非选中 删除当前选中的列表)

    1 address.html <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  4. ThinkJS框架入门详细教程(二)新手入门项目

    一.准备工作 参考前一篇:ThinkJS框架入门详细教程(一)开发环境 安装thinkJS命令 npm install -g think-cli 监测是否安装成功 thinkjs -v 二.创建项目 ...

  5. Bootstrap表格样式(附源码文件)--Bootstrap

    1.表格默认样式 <h4>表格默认样式</h4><table><!--默认样式--> <tr><th>序号</th> ...

  6. 张高兴的 Xamarin.Android 学习笔记:(四)常用控件

    示例地址 GitHub : https://github.com/ZhangGaoxing/xamarin-android-demo/tree/master/ControlsDemo

  7. Rolling Hash(Rabin-Karp算法)匹配字符串

    您可以在我的个人博客中访问此篇文章: http://acbingo.cn/2015/08/09/Rolling%20Hash(Rabin-Karp%E7%AE%97%E6%B3%95)%E5%8C%B ...

  8. Linux入门(15)——Ubuntu16.04安装codeblocks搭建C/C++的IDE环境

    安装codeblocks: sudo add-apt-repository ppa:damien-moore/codeblocks-stable sudo apt-get update sudo ap ...

  9. SGU 223 Little Kings(状压DP)

    Description 用字符矩阵来表示一个8x8的棋盘,'.'表示是空格,'P'表示人质,'K'表示骑士.每一步,骑士可以移动到他周围的8个方格中的任意一格.如果你移动到的格子中有人质(即'P'), ...

  10. LINUX 笔记-ls命令

    常用参数: -l :列出长数据串,包含文件的属性与权限数据等 -a :列出全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用) -d :仅列出目录本身,而不是列出目录的文件数据 -h :将文件 ...