仓储repository概念
1.为什么要用仓储?(仓储有什么用)
1.1 解耦
为了解耦领域层与数据映射层的关系。
1.2 管理增删查改
仓储模式最大的优点就是所有的数据访问首先是通过仓库的,对仓库的增删改都不会立即提交到数据库,而只有当调用了仓库包裹器,这些增删改的操作才会一次提交到数据库。
2.仓储怎么实现?
2.1通过接口实现增删查改的类;
2.2实现层继承引入ORM;
博客园有很多例子,这里不一一例举。
3.通过EF实现仓储
因为EF本身即是按照repository来设计的。请看下面这行代码:
var db = new DemoDbContext();
这里的db即相当于是repository的包裹器。通过包裹器可以非常轻松的访问到其下的每一个repository,这也绝对是最简单的访问方式了,如:
db.Users....
db.Products...
自己实现的repository还要通过IOC。
3.1 EF实现仓储
在EF中,DbSet即是定义的仓库,DbContext即是仓库包裹器。所有对DbSet的增删改都只有在调用了DbContext的SaveChanges之后才会提交到数据库。这样看,EF完全实现了Repository了。
3.2对应到Northwind项目
Northwind里其实也有仓储,只不过通过EF的Repository进行实现。
3.2.1定义仓库
INorthwindDbContext接口定义了仓库,如下:
public interface INorthwindDbContext
{
DbSet<Category> Categories { get; set; }
DbSet<Customer> Customers { get; set; }
DbSet<Employee> Employees { get; set; }
DbSet<EmployeeTerritory> EmployeeTerritories { get; set; }
DbSet<OrderDetail> OrderDetails { get; set; }
DbSet<Order> Orders { get; set; }
DbSet<Product> Products { get; set; }
DbSet<Region> Region { get; set; }
DbSet<Shipper> Shippers { get; set; }
DbSet<Supplier> Suppliers { get; set; }
DbSet<Territory> Territories { get; set; }
DbSet<User> Users { get; set; }
Task<int> SaveChangesAsync(CancellationToken cancellationToken);
}
3.2.2利用EFCore的Dbset中的增删查改方法对仓储进行操作
a. 增,删操作。
_context.Customers.Add(entity);
_context.Customers.Remove(entity);
b. 改操作,改通过根据ID查询出来,将最新请求的request 进行逐个赋值。但是这很难达到通用性,以后每个仓库都需要进行类似Address,City,Company...的更改。
var entity = await _context.Customers
.SingleOrDefaultAsync(c => c.CustomerId == request.Id, cancellationToken);
entity.Address = request.Address;
entity.City = request.City;
entity.CompanyName = request.CompanyName;
entity.ContactName = request.ContactName;
entity.ContactTitle = request.ContactTitle;
entity.Country = request.Country;
entity.Fax = request.Fax;
entity.Phone = request.Phone;
entity.PostalCode = request.PostalCode;
c. 查操作
var entity = await _context.Customers
.FindAsync(request.Id);
d. 一起提交操作
e. 仓库包裹器提交数据库
_context.SaveChangesAsync(cancellationToken);
用EF做仓库的缺点
1.无法解耦ORM;
2.更改数据的时候需要对每个仓库的字段进行一一对应。
QQ群技术讨论:20120449
仓储repository概念的更多相关文章
- Repository 仓储,你的归宿究竟在哪?(一)-仓储的概念
写在前面 写这篇博文的灵感来自<如何开始DDD(完)>,很感谢young.han兄这几天的坚持,陆陆续续写了几篇有关于领域驱动设计的博文,让园中再次刮了一阵"DDD探讨风&quo ...
- C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)
前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...
- C#进阶系列——DDD领域驱动设计初探(三):仓储Repository(下)
前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...
- 仓储Repository
仓储Repository(下) 前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加 ...
- DDD领域驱动设计仓储Repository
DDD领域驱动设计初探(二):仓储Repository(上) 前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repositor ...
- 关于一点儿对仓储(Repository)的理解
仓储(Repository) 内容来源于dudu的 关于Repository模式一文 Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间.它的存在让领域层感觉不到数据访问层的 ...
- DDD领域驱动设计初探(二):仓储Repository(上)
前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...
- DDD领域驱动设计初探(三):仓储Repository(下)
前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...
- .net core2.x - 关于仓储(Repository)
概要:在搭建框架,顺手说下写下,关于Repository,可能你理解了,可能你还不理解,可能与不可能不是重点,重点是感兴趣就看看吧. 1.仓储(Repository)是什么? 看下翻译:仓库; 贮藏室 ...
随机推荐
- 在MFC中怎么获得Excel文档中已经使用了的行数和列数
_Worksheet ws;Range range; range = ws.GetUsedRange();//获得Worksheet已使用的范围range = range.GetRows(); / ...
- bzoj 4318 OSU 概率期望dp
可以发现:f[i]转移到f[i+1]只和最后一串1的长度和平方有关, 因为如果新加的位置是1,贡献就是(x+1)^3-x^3=3x^2+3x+1,否则为0: 所以对于每一个位置,处理出期望的f,x和x ...
- BZOJ_4756_[Usaco2017 Jan]Promotion Counting_树状数组
BZOJ_4756_[Usaco2017 Jan]Promotion Counting_树状数组 Description n只奶牛构成了一个树形的公司,每个奶牛有一个能力值pi,1号奶牛为树根. 问对 ...
- 面试题之小炼牛刀zip,lambda,map
# 现有两元祖,(('a'),('b')),(('c'),('d'))# 请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]t1=(('a'),('b'))t2=(('c' ...
- MySQL · 引擎特性 · 临时表那些事儿
前言 相比于普通的用户数据表,MySQL/InnoDB中的临时表,大家应该会陌生很多.再加上不同的临时表创建的时机和创建的位置都不固定,这也进一步加大神秘感.最让人捉摸不透的是,临时表很多时候会先创建 ...
- 哪些类继承了Collection接口
Collection集合的基本结构: 1.Collection接口 Collection是最基本集合接口,它定义了一组允许重复的对象.Collection接口派生了两个子接口Set和List, ...
- PHP过滤数组中的空值
php对数组的操作已经很完善了,提供给我们很多内置函数用以操作数组,其实可以用array_filter函数对PHP数组中的控制进行过滤 array_filter() 函数用回调函数过滤数组中的值.该函 ...
- python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
在学习python语言中用json库解析网络数据时,我遇到了两个编译错误:json.decoder.JSONDecodeError: Expecting property name enclosed ...
- Django解决跨域问题
原理:浏览器的同源策略,其实我们的请求发送过去了,服务器也进行响应了,就是浏览器把响应给阻止响应而已 第一种方法jsonp 因为浏览器不对 <script> 标签里面的src属性进行阻止, ...
- 链表底层实现Java的Map(上)
链表实现Map public class LinkListMap<K,V> implements Map<K,V> { private class Node { public ...