本以为,关于这方面的理解,园子中的文章已经很多的了,再多做文章真的就“多做文章了”,但是最近发现,还是有必要的,首先,每个人对于同一事物的理解方式和出发点都是不同的,所以思考的方式得到结果也是不同的。另外鉴于网友 @白细胞 的需求,需要对这方面的理解,索性写写,时间有些紧张,所有拖了两天,抱歉。

首先,在此说明,本人从未有人教过,也没有在公司的项目中使用过这些内容,原因很简单,ZF的东西,用不到这些,实属无奈直觉,而本人却相当,甚至放荡的喜好这些东西。结束~~~

以下分三点简要讲述:1,repository模式 2,UnitOfWork模式,3,二者常用关系

一,repository模式

描述和作用:

按照最初提出者的介绍,它是衔接数据映射层和域之间的一个纽带,作用相当于一个在内存中的域对象集合。客户端对象把查询的一些实体进行组合,并把它们提交给Repository。对象能够从Repository中移除或者添加,就好比这些对象在一个Collection对象上就行数据操作,同时映射层的代码会对应的从数据库中取出相应的数据。

从概念上讲,Repository是把一个数据存储区的数据给封装成对象的集合并提供了对这些集合的操作。。。。。。。

在领域驱动设计中,我们有个集合(aggregate)的概念, 通常我们是对于domain的每个集合会对应的定义一个repository。也就说,并不是每个实体都会有对应的一个repository。(假设这是一个仓库,简介源自网上摘录。。)

二,UnitOfWork模式

描述和作用:

简说了,主要作用是在数据持久化过程中,数据提,确保数据的完整性,对象使用确保同一上下文对象。如果有异常,提供回滚。

三,二者的关系

  即:

工作单元服务于仓储,并在工作单元中初始化上下文,为仓储单元提供上下文对象,由此确保同一上下文对象。

那么此时,问题来了,怎么在仓储中获取上下文。(使用的orm为 EF,以autofac或者MEF实现注入,以此为例) 所以,此时实现就变得很简单。

看脚本:

UOW中

在uow中初始化上下文对象,定义了Context的属性对象(当然,这地方可以不初始化,可以有IOC在注入时候带入参数注入,详见IOC,常见方式就几种,实现方式也很类似。) 此处如果看的觉得不爽,换成DbSet对象也可,您请随意。

repository中

在仓储构造函数中,默认初始化仓储对象和获取上下文对象,好像讲完了,没有了~~~~

以下是本人目前的,我可以说写着玩的吗?就是比较喜爱,但是有弊端,用久了就发觉了,二者组合不是很合适,尽管很多人推崇。当然好处显而易见,就是提供了统一的开发模式和规范,是开发人员的开发方式更具规则性 ,更好维护。

uow:

public OlympicOverDbContext Context {get{......初始化上下文}}

 
        public bool IsCommitted { get; set; }
 
        public int Commit()
        {
            if (IsCommitted) return 0;
            try
            {
                int result = Context.SaveChanges();
                IsCommitted = true;
                return result;
            }
            catch (DbEntityValidationException advEx)
            {
                ...捕捉异常
                return -1;
            }
        }
 
        public void RollBack()
        {
            IsCommitted = false;
        }
 
        public void Dispose()
        {
            if (!IsCommitted)
            {
                Commit();
            }
            Context.Dispose();
        }

repository仓储:

 
public OlympicOverRepository(IUnitOfWork unitOfWork)
        {
            UnitOfWork = unitOfWork;
            //Context = unitOfWork.GetDbContext;
            Context = ((UnitOfWork.UnitOfWork)unitOfWork).Context;
        }
 
#region 属性
        /// <summary>
        ///     获取仓储上下文的实例
        /// </summary>
        public IUnitOfWork UnitOfWork { get; }
        /// <summary>
        /// 数据上下文
        /// </summary>
        protected DbContext Context { get; private set; }
 
        /// <summary>
        ///     获取  当前实体的查询数据集
        /// </summary>
        public IQueryable<TEntity> Entities
        {
            get
            {
                return Context.Set<TEntity>();
            }
        }
 
 
        #endregion

....增改删,略....

如有理解不当之处,还各位大能指出,多多赐教,谢谢。

关于 Repository和UnitOfWork 模式的关系的更多相关文章

  1. DDD:Repository和UnitOfWork的生命周期问题

    UnitOfWork UnitOfWork是一种有状态的.用例级别的对象.如果不采用ORM是不会使用UnitOfWork模式的, Repository Repository是一种特殊的领域服务,因此是 ...

  2. MVC实用架构设计(三)——EF-Code First(1):Repository,UnitOfWork,DbContext

    前言 终于到EF了,实在不好意思,最近有点忙,本篇离上一篇发布已经一个多星期了,工作中的小迭代告一段落,终于有点时间来继续我们的架构设计了,在这里先对大家表示歉意. 其实这段时间我并不是把这个系列给忘 ...

  3. Laravel与Repository Pattern(仓库模式)

    为什么要学习Repository Pattern(仓库模式) Repository 模式主要思想是建立一个数据操作代理层,把controller里的数据操作剥离出来,这样做有几个好处: 把数据处理逻辑 ...

  4. Repository仓储 UnitofWork

    Repository仓储 UnitofWork 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 本章我们来创建仓储类Repository 并且引入 UnitOfWork 我对 ...

  5. 一步一步学EF系列 【7、结合IOC ,Repository,UnitOfWork来完成框架的搭建】

    前言 距离上一篇已经有段时间了,最近这段时间赶上新项目开发,一直没有时间来写.之前的几篇文章,主要把EF的基础都讲了一遍,这批文章就来个实战篇. 个人在学习过程中参考博客: Entity Framew ...

  6. .net core2.x - 关于工作单元(UnitOfWork) 模式

    概要:在搭建框架,顺手说下写下,关于unitofwork,可能你理解了,可能你还不理解,可能与不可能不是重点,重点是感兴趣就看看吧. 1.工作单元(unitofowork)是什么(后面简写uow)? ...

  7. Repository与UnitOfWork引入

    Repository是什么? 马丁大叔的书上同样也有解释:它是衔接数据映射层和域之间的一个纽带,作用相当于一个在内存中的域对象映射集合,它分离了领域对象和数据库访问代码的细 节.Repository受 ...

  8. 【无私分享:ASP.NET CORE 项目实战(第五章)】Repository仓储 UnitofWork

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 本章我们来创建仓储类Repository 并且引入 UnitOfWork 我对UnitOfWork的一些理解  UnitOfW ...

  9. Oracle dblink的连接模式的关系测试总结

    这篇主要介绍一下database link由于连接数据库的方式不同遇到的一些问题,我们知道连接ORACLE服务器的模式一般有两种方式:专用服务器连接(dedicated server)和共享服务器连接 ...

随机推荐

  1. C语言嵌入式系统编程修炼之四:屏幕操作

    汉字处理 现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉字库,往往只是需要提供数量有限的汉字供必要的显示功能.例如,一个微波炉的LCD上没有必要提供显示"电子邮件"的功 ...

  2. logstash 安装WARNING: SSLSocket#session= is not supported

    logstash官方提供的插件安装方法是: bin/plugin install logstash-output-webhdfs按照此方法,不出意料肯定会出现以下错误: [ec2-user@ip-xx ...

  3. Bluetooth LE(低功耗蓝牙) - 第二部分

    回顾 在前面的文章中我们介绍了Bluetooth LE的背景也说明了我们在本系列文章中将要开发什么,但是还没有实际的代码.我们将在这篇文章中纠正这一点,我们将通过定义 Service/Activity ...

  4. Android adb opendir failed ,permission denied

    最近在使用adb命令ls的时候会提示:adb opendir failed ,permission denied , 解决方法: adb shell cd data/data/pakageName l ...

  5. 我的第一份vim程序

    vim太好用了吧!!!根本停不下来啊! devc++再见! /*==================================================================== ...

  6. Linux Shell编程(18)—— 循环控制

    影响循环行为的命令break, continuebreak和continue这两个循环控制命令[1]与其它语言的类似命令的行为是相同的. break命令将会跳出循环,continue命令将会跳过本次循 ...

  7. excel小技巧-用于测试用例的编号栏:“获取当前单元格的上一格的值+1”=INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1

    编写用例的时候使用,经常修改用例的时候会需要增加.删除.修改条目,如果用下拉更新数值的方式会很麻烦. 1.使用ctrl下拉,增删移动用例的时候,需要每次都去拉,万一列表比较长,会很麻烦 2.使用ROW ...

  8. Render To Texel Baker

    今天仔细研究了 Shaowgun 示例中那个金黄色雕像所使用的光照纹理烘焙工具:“Render To Texel Baker”.因为要在移动设备展现比较逼真的光照效果,但是实时使用法线贴图并大量用于场 ...

  9. [git] git 分支( branch ) 的基本使用

    分支( branches ) 是指在开发主线中分离出来,做进一步开发而不影响到原来主线. Git 存储的不是一系列的更改集( changeset ),而是一系列快照.当你执行一次 commit 时, ...

  10. cobbler_web安装