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

首先,在此说明,本人从未有人教过,也没有在公司的项目中使用过这些内容,原因很简单,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. Bitmap介绍

    转自:http://blog.csdn.net/xgdofull/article/details/5424611 简单的说就是用数组存放若有数据就标志为1或true,若不存在标志为0或false.比如 ...

  2. KeilC51使用详解 (三)

    C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统. 第一节 本征库函数(intrinsic rou ...

  3. 15个网页设计必备的Google Chrome 扩展

    2011年第一篇,翻译自freelancefolder的一篇文章.以下为译文内容: 最近,我将Google Chrome作为了我的主力浏览器,同时,将其作为我设计和开发网页的工具,尽管我还时常会去Fi ...

  4. vs2010编译curl为static库及测试

    1,编译curl为static库 用vs2010打开: curl-7.32.0\vs\vc6\vc6curl.dsw 选择LIB Release生成libcurl静态库: curl-7.32.0\vs ...

  5. Qt 中update()和repaint()的区别

    void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽]通过立即调用paintEvent()来直接重新绘制 ...

  6. 2.5.2 使用alertdialog 创建列表对话框

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...

  7. JavaScript高级程序设计8.pdf

    基本包装类型 为了便于操作基本类型值,ECMAScript定义了3个特殊的引用类型Boolean,Number和String.这些类型与本章介绍的其他用类型相似,同时也具备与各自的基本类型相应的特殊行 ...

  8. Java 交换两个变量的数值

    一.参数传递方法 为解决标题问题,首先介绍参数传递方法.目前各类程序设计语言的参数传递方法主要有三种: 按值传递 按引用传递 按指针传递 其中按值传递表示方法(函数)接收的是调用者提供的变量的拷贝,不 ...

  9. linux平台MongoDB数据库安装

    跟Ruiy哥一起玩转吧; <一,初始化玩转MongoDB> 1,关闭SElinux(Ruiy哥根据经验知红帽的SElinux架设就是个错误,还记得不管啥结构首先要关闭的就是它); 2,设置 ...

  10. Google的一些功能和软件

    本博文的主要内容有 .Google的一些功能和软件 Google的一些功能和软件 1.  iGoogle 2.  Google Earth 3.  Google Talk http://www.goo ...