工作单元模式往往和仓储模式一起使用,本篇文章讲到的是工作单元模式和仓储模式一起用来在ef外面包一层,其实EF本身就是工作单元模式和仓储模式使用的经典例子,其中DbContext就是工作单元,而每个DbSet就是每个仓储,只有DbContext可以进行持久化操作。

那么我们为什么还要在EF的外面再包一层对EF进行封装呢,有时候也是需要这样做的
根据需要我们可以把EF框架和业务逻辑分开以达到解耦的目的。便于以后在需要的时候用其他ORM框架代替EF。
另外,如果只使用仓储模式,那么我们就会在每个仓储中进行持久化操作。这样做往往是不合理的,
持久化的操作应当交给工作单元。

代码如下(代码是从网上找的例子)

public class EventsController : Controller
{
private readonly ApplicationDbContext _context;
private readonly UnitOfWork _unitOfWork; public EventsController()
{
_context = new ApplicationDbContext();
_unitOfWork = new UnitOfWork(_context);
} public ActionResult Details(int id)
{
var event = _unitOfWork.Events.GetEvent(id);
if (event == null)
return HttpNotFound(); var viewModel = new EventDetailsViewModel { Event = event }; return View("Details", viewModel);
} [Authorize]
public ActionResult MyEvents()
{
var userId = User.Identity.GetUserId();
var events = _unitOfWork.Events.GetUpcomingEventsByArtist(userId); return View(events);
} [Authorize]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(EventFormViewModel viewModel)
{
if (!ModelState.IsValid)
{
viewModel.Genres = _unitOfWork.Genres.GetGenres();
return View("EventForm", viewModel);
} var event = new Event
{
ArtistId = User.Identity.GetUserId(),
DateTime = viewModel.GetDateTime(),
GenreId = viewModel.Genre,
Venue = viewModel.Venue
}; _unitOfWork.Events.Add(event);
_unitOfWork.Complete(); return RedirectToAction("MyEvents", "Events");
}
}
public class UnitOfWork
{
private readonly ApplicationDbContext _context; public EventRepository Events { get; private set; }
public GenreRepository Genres { get; private set; } public UnitOfWork(ApplicationDbContext context)
{
_context = context;
Events = new EventRepository(context);
Genres = new GenreRepository(context);
} public void Complete()
{
_context.SaveChanges();
}
}

关于工作单元模式——工作单元模式与EF结合的使用的更多相关文章

  1. Asp.Net Core仓储模式+工作单元

    仓储模式+工作单元 仓储模式 仓储(Repository)模式自2004年首次作为领域驱动模型DDD设计的一部分引入,仓储本质上是提供提供数据的抽象,以便应用程序可以使用具有接口的相似的简单抽象集合. ...

  2. 【VBA研究】工作表自己主动筛选模式检測

    作者:iamlaosong 用VBA程序处理Excel数据文件.用户的数据文件有时处于自己主动筛选模式,往往导致数据处理不对.为此,须要检測工作表是否处于该模式,假设是,则去掉自己主动筛选.语句例如以 ...

  3. Spark基本工作流程及YARN cluster模式原理(读书笔记)

    Spark基本工作流程及YARN cluster模式原理 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark基本工作流程 相关术语解释 Spark应用程序相关的几 ...

  4. [工作中的设计模式]策略模式stategy

    一.模式解析 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式的关键点为: 1.多种算法存在 2.算法继承同样的接口 ...

  5. rpyc 回调模式工作不正常

    rpyc 回调模式工作不正常 最近使用了 rpyc 来处理一个多节点间的文件同步的任务,目标是使用 rpyc 来实现简单的 p2p 文件传输机制,以减少单点负载和单点失败对传输的影响. 和 p2p 的 ...

  6. php在apache中一共有三种工作方式:CGI模式、FastCGI模式、Apache 模块DLL

    php在apache中一共有三种工作方式:CGI模式.FastCGI .FastCGI是什么? FastCGI是语言无关的.可伸缩架构的CGI开放扩展,其主要行 为是将CGI解释器进程保持在内存中并因 ...

  7. GVRP 的工作机制和工作模式

    GVRP 简介 GVRP 基于 GARP 的工作机制来维护设备中的 VLAN 动态注册信息,并将该信息向其他设备传播:当设备启动了 GVRP 之后,就能够接收来自其他设备的 VLAN 注册信息,并动态 ...

  8. 嵌入式中 ARM的几种工作模式 以及异常模式的优先级

    一.Arm工作模式: Arm微处理器支持7种工作模式,分别为: 1. 用户模式(Usr)            用于正常执行程序 2. 快速中断模式(FIQ)    用于高速数据传输 3. 外部中断模 ...

  9. FTP两种工作模式:主动模式(Active FTP)和被动模式

    在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令.服务器接收到命令后,会用其本地的FTP数据端口 ...

随机推荐

  1. Docker 版本的更新和安装

    涉及到网址:1.https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#prerequisites (官网)       ...

  2. in mind (不是 切记 的意思)

    Both Grunt and Gulp.js perform these automation tasks particularly well, although Gulp.js has the ed ...

  3. Java NIO 学习笔记 缓冲区补充

    1.缓冲区分配 方法   以 ByteBuffer 为例 (1)使用静态方法 ByteBuffer buffer = ByteBuffer.allocate( 500 ); allocate() 方法 ...

  4. unity读取灰度图生成三维地形mesh

    准备灰度图 IGray.png及草地贴图 IGrass.jpg ,放入Assets下StreamingAssets文件夹中.     创建空材质,用作参数传入脚本.   脚本如下,挂载并传入材质球即可 ...

  5. 限流保护——nginx限流模块

    1.限制请求次数——limit_req_zone模块 a.意义:limit_req_zone 表示限制单位时间内的请求数,即速率限制,采用的漏桶算法 a.在 conf/nginx.conf 配置文件中 ...

  6. 忘记Linux的root登录密码?不用害怕,破解掉它就可以了!!!

    在开启centos 7主机后会出现下面这个界面,此时要把光标放到界面内,然后按“e”进入下一个界面. 按完“e”会出现一个新的界面,然后按“↓”找到“Linux16”这行,在最后面的UTF-8后面输入 ...

  7. vue8种通信方式

    参考:https://juejin.im/post/5d267dcdf265da1b957081a3#heading-1(写的很详细)    https://blog.csdn.net/songxiu ...

  8. 关于使用Arduino做开发的理解

    转载自arduino中文社区 https://www.arduino.cn/thread-5414-1-1.html 见到很多人对Arduino的开发方法 .应用场景有误解,特别开个帖子说明下. 误解 ...

  9. 解决Vue跨域问题 : 正向代理与反向代理

    你需要做一个反向代理的东西   ===> 打开你的vue项目的config文件夹下的index.js 找到以下代码 dev: { proxyTable: { '/api': { target: ...

  10. POJ 3274/洛谷 1360:Gold Balanced Lineup 黄金阵容平衡

    题目描述 Farmer John's N cows (1 ≤ N ≤ 100,000) share many similarities. In fact, FJ has been able to na ...