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ステップ」 ...
随机推荐
- 【工具篇】.NET开发常用工具
1 问题概述 本篇文章主要介绍,笔者在开发工作中,常用的开发工具.见下表: 2 工具介绍 2.1 接口调试工具 —— Postman 2.1.1 推荐网站 https://www.get ...
- MongoDB学习教程(2)-常用命令
1.MongoDB 创建数据库 use DATABASE_NAME,如果数据库不存在,则创建数据库,否则切换到指定数据库. > use test_0902 switched to db test ...
- Python自学笔记-生成器(来自廖雪峰的官网Python3)
感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. 生成器 通过列 ...
- js 将一大段时间均分为很多个小时间段
最近写项目,遇到一个将选中时间段平均分割为若干小段,然后根据小段时间在数据库查询求均值的问题,后台大哥犯懒,非说后台做不了,让我分好传给他ヾ(. ̄□ ̄)ツ゜゜゜好气呦,但还要保持微笑,我就是这么懂礼貌 ...
- Hadoop通过HCatalog编写Mapreduce任务访问hive库中schema数据
1.dirver package com.kangaroo.hadoop.drive; import java.util.Map; import java.util.Properties; impor ...
- JavaScript实现模糊推荐的input框(类似百度搜索框)
如何用JS实现一个类似百度搜索框的输入框呢,再填充完失去焦点时,自动填充配置项,最终效果如下图: 实现很简单,但是易用性会上升一大截,需要用到的有jquery-ui的autocomplete,jque ...
- 图片与字符串(base64编码)的转化
package com.demo; import java.util.*; import java.io.*; import sun.misc.BASE64Decoder; import sun.mi ...
- jquery各种事件使用方法总结(from:天宇之游)
ps:本博客转自博主 天宇之游 ,地址:http://www.cnblogs.com/cwp-bg/ ,再次感谢天宇之游.jquery事件使用方法总结 一.鼠标事件1. click():鼠标单击事 ...
- 阿里巴巴Java规约插件试用
阿里Java开发规约Eclipse插件介绍 阿里巴巴集团配合<阿里巴巴Java开发手册>PDF终极版开发的IDE插件,目前包括IDEA插件.Eclipse插件. 安装 检查环境 插件要求: ...
- Java 多态、内部类、异常、包
一.多态 1. 概述 理解:多态可以理解为事物存在的多种体(表)现形态. 例如: 动物中的猫和狗. 猫这个对象对应的是猫类型,例如:猫 x = new 猫(); 同时猫也是动物中的一种,也可以把猫称为 ...