关于工作单元模式——工作单元模式与EF结合的使用
工作单元模式往往和仓储模式一起使用,本篇文章讲到的是工作单元模式和仓储模式一起用来在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结合的使用的更多相关文章
- Asp.Net Core仓储模式+工作单元
仓储模式+工作单元 仓储模式 仓储(Repository)模式自2004年首次作为领域驱动模型DDD设计的一部分引入,仓储本质上是提供提供数据的抽象,以便应用程序可以使用具有接口的相似的简单抽象集合. ...
- 【VBA研究】工作表自己主动筛选模式检測
作者:iamlaosong 用VBA程序处理Excel数据文件.用户的数据文件有时处于自己主动筛选模式,往往导致数据处理不对.为此,须要检測工作表是否处于该模式,假设是,则去掉自己主动筛选.语句例如以 ...
- Spark基本工作流程及YARN cluster模式原理(读书笔记)
Spark基本工作流程及YARN cluster模式原理 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark基本工作流程 相关术语解释 Spark应用程序相关的几 ...
- [工作中的设计模式]策略模式stategy
一.模式解析 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式的关键点为: 1.多种算法存在 2.算法继承同样的接口 ...
- rpyc 回调模式工作不正常
rpyc 回调模式工作不正常 最近使用了 rpyc 来处理一个多节点间的文件同步的任务,目标是使用 rpyc 来实现简单的 p2p 文件传输机制,以减少单点负载和单点失败对传输的影响. 和 p2p 的 ...
- php在apache中一共有三种工作方式:CGI模式、FastCGI模式、Apache 模块DLL
php在apache中一共有三种工作方式:CGI模式.FastCGI .FastCGI是什么? FastCGI是语言无关的.可伸缩架构的CGI开放扩展,其主要行 为是将CGI解释器进程保持在内存中并因 ...
- GVRP 的工作机制和工作模式
GVRP 简介 GVRP 基于 GARP 的工作机制来维护设备中的 VLAN 动态注册信息,并将该信息向其他设备传播:当设备启动了 GVRP 之后,就能够接收来自其他设备的 VLAN 注册信息,并动态 ...
- 嵌入式中 ARM的几种工作模式 以及异常模式的优先级
一.Arm工作模式: Arm微处理器支持7种工作模式,分别为: 1. 用户模式(Usr) 用于正常执行程序 2. 快速中断模式(FIQ) 用于高速数据传输 3. 外部中断模 ...
- FTP两种工作模式:主动模式(Active FTP)和被动模式
在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令.服务器接收到命令后,会用其本地的FTP数据端口 ...
随机推荐
- shell cat 用法
cat命令的用途是连接文件或标准输入并打印. 1.命令格式:cat [选项] [文件]... 2.命令功能:cat主要有三大功能:1.一次显示整个文件:cat filename --常用来显示文件 ...
- C之数据类型
java的数据类型 byte 1个字节 boolean 1个字节 short 2个字节 char 2个字节 int 4个字节 float 4个字节 long 8个字节 double 8个字节 c语言的 ...
- Linux发行版本简介
Linux发行版 1. Linux本身 1.1. 1991年,当时一名来自赫尔辛基的计算机科学学生LinusTorvalds创建了一个操作系统内核 1.1.1. 一年后 ...
- Kibana Query Language(KQL)
语法: 官方文档 If you’re familiar with Kibana’s old lucene query syntax, you should feel right at home wit ...
- Ubuntu 18.04 上使用xrdp远程桌面连接
参考:https://blog.csdn.net/qq_25556149/article/details/82216190 1,环境查看 2,安装 xrdp.tightvncserver apt-ge ...
- JavaScript快速开发
c标签导入 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> fn函数 ...
- 46.前端html5标签学习
HTML:TR TD TH OL UL LI 这几个标签要区别 一.什么是HTML: 超文本标记语言(HyperText Markup Language),标准通用标记语言下的一个应用: 是 ...
- SQL SERVER2014 加密 备份恢复 学习 (一)
SQL 自2008(还是2005)之后,推出加密功能,可以一定程度上保护数据库的备份安全.以下测试环境为:sql server 2014主要目的:将备份的文件加密,在其它电脑上恢复时必须有证书和密钥才 ...
- mui mui-control-item获得选中的标签
function getActiveControl() { var segmentedControl = document.getElementById("top-scroll") ...
- jupyter notebook 常用快捷操作
Shift-Enter 执行当前cell,并自动跳到下一个cell Ctrl-Enter 执行当前cell,执行后不自动调转到下一个cell DD 删除当前的cell L 为当前的cell加入line ...