回到目录

在之前写的DDD~基础设施层文章中,提到了UnitOfWork,它里面有一些方法,但经过项目证明,不应该有Save和IsExplicitSubmit,而这个工作单元只起到了数据上下文统一的作用,如A和B对象需要在同一个上下文中工作,这时,我们可以引用工作单元的概念,而对于保存和提交操作,还是应该在局部方法里完成的。

为了不去触发MSDTC,我会封装一个特殊的事务,来实现这个工作,而对于SQL2008来说,可以直接使用.net自己的TransactionScope实现,对于同一个数据库来说,它不会被提升为分布式事务,而SQL2008以下的版本,则需要使用占占封装的事务,代码如下:

    /// <summary>
/// Author:zhang.zhanling
/// 同步文章:http://www.cnblogs.com/lori/p/3455393.html
/// 对TransactionScope,让它对同一个数据库不产生msdtc服务
/// </summary>
public class TransactionScopeNoMsdtc
{
/// <summary>
/// 产生包裹事务
/// 支持LINQ表提交,并同时返回提交结果到实体
/// </summary>
/// <param name="db">数据上下文,多个方法使用的上下文必须是同一个</param>
/// <param name="isOutermost">是否为最外层,默认为false</param>
/// <param name="action">处理代码块</param>
public static void UsingNoMsdtc(DbContext db, bool isOutermost, Action action)
{
var objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)db).ObjectContext;
try
{
if (objectContext.Connection.State == System.Data.ConnectionState.Closed)
objectContext.Connection.Open();
using (TransactionScope trans = new TransactionScope())
{
try
{
action();
trans.Complete();
}
catch (Exception)
{
throw;
}
finally
{
trans.Dispose();
}
}
}
catch (Exception)
{
throw;
}
finally
{
if (isOutermost)//如果是最外层事务,而将连接关闭
{
objectContext.Connection.Close();
}
}
}
/// <summary>
/// 产生包裹事务,它不是最外层的,如果是最外层的需要调用其它重载
/// </summary>
/// <param name="db">数据上下文,多个方法使用的上下文必须是同一个</param>
/// <param name="action">处理代码块</param>
public static void UsingNoMsdtc(DbContext db, Action action)
{
UsingNoMsdtc(db, false, action);
}
}

而最新的IUnitOfWork接口就变成了一个标识接口,代码如下

    /// <summary>
/// 数据上下文标识接口,它对于业务层应该是公开的
/// 它对于实现上下文的方法,它并不关心,可以是linq2sql,ef,ado.net,nhibernate,memory,nosql等
/// </summary>
public interface IUnitOfWork
{
}

我们看到,IUnitOfWork主要作用是标示各个仓储在同一个上下文当中,或者说,在一个工作单元之中,下面是项目中使用的代码,我们可以参考一下

    /// <summary>
/// Point_Info仓储
/// </summary>
/// <remarks>create:cyr_(Ben)_20131128</remarks>
public class Point_InfoRepository : TsingDa_NewLearningBarRepository<Point_Info>
{
#region Constructors
public Point_InfoRepository() : this(null) { }
public Point_InfoRepository(IUnitOfWork db) : base(db) { }
#endregion
}

我们可以看到,上面的仓储提供了两个构造方法的实现,默认为空参,还有一个可以为它传入一个IUnitOfWork工作单元,本仓储也支持IoC的构造方法注入。

回到目录

DDD~基础设施层~续的更多相关文章

  1. DDD领域驱动设计之领域基础设施层

    1.DDD领域驱动设计实践篇之如何提取模型 2.DDD领域驱动设计之聚合.实体.值对象 其实这里说的基础设施层只是领域层的一些接口和基类而已,没有其他的如日子工具等代码,仅仅是为了说明领域层的一些基础 ...

  2. DDD~领域层

    回到目录 再论Domain与Infrastructure 在面向领域的设计中,领域层(Domain)实现上是位于最底层的,其它层有对它的引用,包括基础设施层(Infrastructure)也是去引用领 ...

  3. FAQ:仓储实现为什么在基础设施层?

    FAQ:仓储实现为什么在基础设施层? 目录 问答部分参考文章 问答部分返回目录 问: 仓储实现为什么在基础设施层? 答: 领域模型包含三种元素:实体.值对象和服务,这三种元素都可以以某种形式使用仓储, ...

  4. ABP入门教程7 - 基础设施层更新数据库

    点这里进入ABP入门教程目录 设置数据库 在基础设施层(即JD.CRS.EntityFrameworkCore)打开数据库环境设置 JD.CRS.EntityFrameworkCore/EntityF ...

  5. Lind.DDD敏捷领域驱动框架~Lind.DDD各层介绍

    回到目录 Lind.DDD项目主要面向敏捷,快速开发,领域驱动等,对于它的分层也是能合并的合并,比之前大叔的框架分层更粗糙一些,或者说更大胆一些,在开发人员使用上,可能会感觉更方便了,更益使用了,这就 ...

  6. ABP 基础设施层——集成 Entity Framework

    本文翻译自ABP的官方教程<EntityFramework Integration>,地址为:http://aspnetboilerplate.com/Pages/Documents/En ...

  7. ABP 基础设施层——集成 NHibernate

    本文翻译自ABP的官方教程<NHibernate Integration>,地址为:http://aspnetboilerplate.com/Pages/Documents/NHibern ...

  8. 基础设施层-Adnc.Infr.Consul

    Adnc.Infr.Consul 主要提供服务自动注册/发现以及获取配置. 项目结构 Configuration 配置中心相关共功能,主要有两个关键类 1.ConsulConfigurationPro ...

  9. 我也来说说DDD~大话目录

    回到占占推荐博客索引 DDD之前没有接触过,但一但有了接触就一发不可收拾,他会带去进入一个全新的世界! DDD不是新技术,而是新思想,新模式,是软件开发领域的一次突破,它更接近于业务,对于业务的改动它 ...

随机推荐

  1. BZOJ1742[Usaco2005 nov]Grazing on the Run

    Description John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我们可 以认为草地是一个数轴上的一些点.Joseph看到这些草非常兴奋, ...

  2. Debian 8下vsftpd安装与配置

    Debian 8下vsftpd安装与配置 0.环境 root@remote:/# uname -r 3.16.0-4-amd64 root@remote:/e# lsb_release No LSB ...

  3. 我与solr(五)--关于schema.xml中的相关配置的详解

    先把文件的代码贴上来: <?xml version="1.0" encoding="UTF-8" ?> <!-- 版权说明... --> ...

  4. 记录参加“牛津计划.Docker在线黑客松”比赛的过程

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  5. 20151011 C# 第一篇 运算符

    20151011 表达式: 表达式是由运算符和操作数组成的. 运算符: 1. 算数运算符 运算符 说明 备注 + 加 ++M 前缀增量操作 该操作的操作结果是操作数加 1 之后的值 M++ 后缀增量操 ...

  6. Python 类的命名空间

    Python中类的定义其实就是执行代码块: class cc: a=0 print '+++++', print a 会直接执行print语句而不是在实例化cc时执行.执行后会生成对应的类的命名空间. ...

  7. 基于Chrome内核(WebKit.net)定制开发DoNet浏览器

    1.    源起 a)     定制.Net浏览器 本人是一名C#开发者,而作为C#开发者,做客户端应用中最头痛的一件事就是没有一个好的UI解决方案, WinFrom嘛,效率虽然还不错,但是做一些特殊 ...

  8. Windows XP和Word 2007不能正常使用VSTO插件

    今天帮助同事解决了一个小问题,就是在WindowsXP上,为Word2007开发的插件不能正常显示. 通过搜索关键词 WindowsXp Word 2007 VSTO找到了两个解决方案. http:/ ...

  9. sizeof和指针

    对于sizeof(类或对象)这种形式,如classA1{ public: int a; static int b;A1();~A1();}sizeof计算类或对象在栈中分配的大小,类或对象的静态变量存 ...

  10. Jquery的multifile使用随记

    1.多文件上传: 2.如上几个验证不重复,和限制上传数量的验证显示的是英文,改成中文文本时,如果不用国标解码,到时候提示框会出现乱码现象.所以一般需要中文显示的时候,我们应该这样做: 拿denied做 ...