回到目录

在之前写的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. Tabs - 标签页

    <div class="J_TWidget tab" data-widget-type="Tabs"style="width:宽度px; hei ...

  2. redis客户端连接异常

    本文参考:http://mdba.cn/2015/04/02/redistwemproxy-%e5%ae%a2%e6%88%b7%e7%ab%af%e8%bf%9e%e6%8e%a5%e5%bc%82 ...

  3. SQL事物隔离级别

    标准SQL定义了4个隔离级别 Read uncommitted 未提交读 Read committed 已提交读 Repeatable read 可重复读 Serializable 可序列化 基本语法 ...

  4. Java程序,取随机数的两种实现方法

    1.随机数的第一种程序(取0-9的整型随机数) public class random_1 { public static void main(String[] args) { Random r=ne ...

  5. 访问控制public/protected/private的区别

    Java支持四种不同的访问权限: 修饰符 说明 public 共有的,对所有类可见. protected 受保护的,对同一包内的类和所有子类可见. private 私有的,在同一类内可见. 默认的 在 ...

  6. ARP包分析(wireshark)

    ARP数据报格式(42字节) 这是用wireshark抓到的一个ARP包,42个字节. 这个ARP包的 以太网首部(14字节): 字段               长度(Byte)           ...

  7. asp.net core 使用protobuf

    在一些性能要求很高的应用中,使用protocol buffer序列化,优于Json.而且protocol buffer向后兼容的能力比较好. 由于Asp.net core 采用了全新的MiddleWa ...

  8. poj 2482 Stars in Your Window (线段树:区间更新)

    题目链接:http://poj.org/problem?id=2482 读完题干不免有些心酸(

  9. ofbiz 代码日记

    写代码一定要尽善尽美.. //修改方法 //条件查询 用于修改 List<GenericValue> stoList = delegator.findByAnd("YcrossS ...

  10. C#与Swift异步操作的差异

    作为一个从C#转到Swift的小菜鸡...最近做一个简单的请求API解析Json数据的小程序上碰到一堆小问题.尤其是在异步请求的时候,用惯了C#的async/await写法,在写Swift的时候也按着 ...