• 仓储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

  • 相关阅读:
    Kibana之配置文件
    Elasticsearch之集群,本地搭建集群
    支付宝支付流程
    AJAX应用的五个步骤
    位运算
    微信小程序页面传值详解
    面向对象三大基本特性,五大基本原则
    rem样板
    js 数组 随机排序
    按位异或运算符
  • 原文地址:https://www.cnblogs.com/JerryMouseLi/p/10791125.html
Copyright © 2020-2023  润新知