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概念的更多相关文章

  1. Repository 仓储,你的归宿究竟在哪?(一)-仓储的概念

    写在前面 写这篇博文的灵感来自<如何开始DDD(完)>,很感谢young.han兄这几天的坚持,陆陆续续写了几篇有关于领域驱动设计的博文,让园中再次刮了一阵"DDD探讨风&quo ...

  2. C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)

    前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...

  3. C#进阶系列——DDD领域驱动设计初探(三):仓储Repository(下)

    前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...

  4. 仓储Repository

    仓储Repository(下) 前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加 ...

  5. DDD领域驱动设计仓储Repository

    DDD领域驱动设计初探(二):仓储Repository(上) 前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repositor ...

  6. 关于一点儿对仓储(Repository)的理解

    仓储(Repository) 内容来源于dudu的 关于Repository模式一文 Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间.它的存在让领域层感觉不到数据访问层的 ...

  7. DDD领域驱动设计初探(二):仓储Repository(上)

    前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...

  8. DDD领域驱动设计初探(三):仓储Repository(下)

    前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...

  9. .net core2.x - 关于仓储(Repository)

    概要:在搭建框架,顺手说下写下,关于Repository,可能你理解了,可能你还不理解,可能与不可能不是重点,重点是感兴趣就看看吧. 1.仓储(Repository)是什么? 看下翻译:仓库; 贮藏室 ...

随机推荐

  1. 一个js小游戏----总结

    花了大概一天左右的功夫实现了一个js小游戏的基本功能,类似于“雷电”那样的小游戏,实现了随即怪物发生器,碰撞检测,运动等等都实现了,下一个功能是子弹轨迹,还有其他一些扩展功能,没有用库,也没有用web ...

  2. ;(function(){})()这种写法分号的作用 todomvc

    常看到一些大牛的JS源码 在function 前面加; ;function($,undefined) 是什么用处 ? ;(function($){$.extend($.fn... 在前面加分号可以有多 ...

  3. 连接Redis后执行命令错误 MISCONF Redis is configured to save RDB snapshots

    今天在redis中执行setrange name 1 chun 命令时报了如下错误提示: (error) MISCONF Redis is configured to save RDB snapsho ...

  4. ATOM系列之-atom报错"Cannot load the system dictionary for zh-CN"

    atom报错"Cannot load the system dictionary for zh-CN" 想必很多人(程序猿&程序媛)都和我一样,喜欢的这款很拉风的代码编辑器 ...

  5. BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集

    BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集 Description     农夫约翰有N(2≤N≤40000)个农场,标号1到N,M( ...

  6. HTML5仿微信聊天界面、微信朋友圈实例

    这几天使用H5开发了一个仿微信聊天前端界面,尤其微信底部编辑器那块处理的很好,使用HTML5来开发,虽说功能效果并没有微信那么全,但是也相当不错了,可以发送消息.表情,发送的消息自动回滚定位到底部,另 ...

  7. Scrapy爬虫遇到 ‘Forbidden by robots.txt’的问题

    今天在爬知乎精华时,出现了‘Forbidden by robots.txt’的问题 了解到到scrapy在爬取设定的url之前,它会先向服务器根目录请求一个txt文件,这个文件规定了爬取范围 scra ...

  8. Asp.NETCore轻松学系列阅读指引目录

    前言 耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进阶,适合没有 .NETCore 编程经验到小白同学,也适合从 .NET Framework 迁移 ...

  9. aps .net MVC单用户登录

    当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线. 原文地址:http://www.cnblogs.com/f23wangj/p/4984302.htm ...

  10. 细说并发编程-TPL

    本节导航 基本概念 并发编程 TPL 线程基础 windows为什么要支持线程 线程开销 CPU的发展 使用线程的理由 如何写一个简单Parallel.For循环 数据并行 Parallel.For剖 ...