倉儲repository概念

1.爲何要用倉儲?(倉儲有什麼用)


1.1 解耦

爲了解耦領域層與數據映射層的關係。數據庫

1.2 管理增刪查改

倉儲模式最大的優勢就是全部的數據訪問首先是經過倉庫的,對倉庫的增刪改都不會當即提交到數據庫,而只有當調用了倉庫包裹器,這些增刪改的操做纔會一次提交到數據庫。設計

2.倉儲怎麼實現?


2.1經過接口實現增刪查改的類;

2.2實現層繼承引入ORM;

博客園有不少例子,這裏不一一例舉。code

3.經過EF實現倉儲


由於EF自己便是按照repository來設計的。請看下面這行代碼:
var db = new DemoDbContext();
這裏的db即至關因而repository的包裹器。經過包裹器能夠很是輕鬆的訪問到其下的每個repository,這也絕對是最簡單的訪問方式了,如:orm

db.Users....
db.Products...

本身實現的repository還要經過IOC。繼承

3.1 EF實現倉儲

在EF中,DbSet 便是定義的倉庫,DbContext便是倉庫包裹器。全部對DbSet 的增刪改都只有在調用了DbContext的SaveChanges以後纔會提交到數據庫。這樣看,EF徹底實現了Repository了。 接口

3.2對應到Northwind項目

Northwind裏其實也有倉儲,只不過經過EF的Repository進行實現。ip

3.2.1定義倉庫

INorthwindDbContext接口定義了倉庫,以下:get

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...的更改。it

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

相關文章
相關標籤/搜索