精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

倉儲模式到底是不是反模式?

存儲 存儲軟件
倉儲模式我們已耳熟能詳,但當我們將其進行應用時,真的是那么得心應手嗎?確定是解放了生產力嗎?這到底是怎樣的一個存在,確定不是反模式?

 [[374908]]

本文轉載自微信公眾號「JeffckyShare」,作者Jeffcky。轉載本文請聯系JeffckyShare公眾號。   

倉儲反模式

5年前我在Web APi中使用EntityFramework中寫了一個倉儲模式,并將其放在我個人github上,此種模式也完全是參考所流行的網傳模式,現如今在我看來那是極其錯誤的倉儲模式形式,當時在EntityFramework中有IDbSet接口,然后我們又定義一個IDbContext接口等等,大同小異,接下來我們看看在.NET Core中大多是如何使用的呢?

定義通用IRepository接口

  1. public interface IRepository<TEntity> where TEntity : class 
  2.     /// <summary> 
  3.     /// 通過id獲得實體 
  4.     /// </summary> 
  5.     /// <param name="id"></param> 
  6.     /// <returns></returns
  7.     TEntity GetById(object id); 
  8.      
  9.     //其他諸如修改、刪除、查詢接口 

當然還有泛型類可能需要基礎子基礎類等等,這里我們一并忽略

 定義EntityRepository實現IRepository接口

  1. public abstract class EntityRepository<TEntity> : IRepository<TEntity> where TEntity : class 
  2.     private readonly DbContext _context; 
  3.  
  4.     public EntityRepository(DbContext context) 
  5.     { 
  6.         _context = context; 
  7.     } 
  8.  
  9.     /// <summary> 
  10.     /// 通過id獲取實體 
  11.     /// </summary> 
  12.     /// <param name="id"></param> 
  13.     /// <returns></returns
  14.     public TEntity GetById(object id) 
  15.     { 
  16.         return _context.Set<TEntity>().Find(id); 
  17.     } 

定義業務倉儲接口IUserRepository接口

  1. public interface IUserRepository : IRepository<User
  2.     /// <summary> 
  3.     /// 其他非通用接口 
  4.     /// </summary> 
  5.     /// <returns></returns
  6.     List<User> Other(); 

 定義業務倉儲接口具體實現UserRepository

  1. public class UserRepository : EntityRepository<User>, IUserRepository 
  2.     public List<User> Other() 
  3.     { 
  4.         throw new NotImplementedException(); 
  5.     } 

我們定義基礎通用接口和實現,然后每一個業務都定義一個倉儲接口和實現,最后將其進行注入,如下:

  1. services.AddDbContext<EFCoreDbContext>(options => 
  2.     options.UseSqlServer(@"Server=.;Database=EFCore;Trusted_Connection=True;"); 
  3. }); 
  4.  
  5. services.AddScoped(typeof(IRepository<>), typeof(EntityRepository<>)); 
  6.  
  7. services.AddScoped<IUserRepository, UserRepository>(); 
  8.  
  9. services.AddScoped<IUserService, UserService>()); 

有一部分童鞋在項目中可能就是使用如上方式,每一個具體倉儲實現我們將其看成傳統的數據訪問層,緊接著我們還定義一套業務層即服務層,如此第一眼看來和傳統三層架構無任何區別,只是分層名稱有所不同而已

每一個具體倉儲接口都繼承基礎倉儲接口,然后每個具體倉儲實現繼承基礎倉儲實現,對于服務層同理,反觀上述一系列操作本質,其實我們回到了原點,那還不如直接通過上下文操作一步到位來的爽快

上述倉儲模式并沒有帶來任何益處,分層明確性從而加大了復雜性和重復性,根本沒有解放生產率,我們將專注力全部放在了定義多層接口和實現上而不是業務邏輯,如此使用,這就是倉儲模式的反模式實現

倉儲模式思考

所有脫離實際項目和業務的思考都是耍流氓,若只是小型項目,直接通過上下文操作未嘗不可,既然用到了倉儲模式說明是想從一定程度上解決項目中所遇到的痛點所在,要不然只是隨波逐流,終將是自我打臉

根據如下官方在微服務所使用倉儲鏈接,官方推崇倉儲模式,但在其鏈接中是直接在具體倉儲實現中所使用上下文進行操作,毫無以為這沒半點毛病

EntityFramework Core基礎設施持久化層

https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-implementation-entity-framework-core

但我們想在上下文的基礎上進一步將基本增、刪、改、查詢進行封裝,那么我們如何封裝基礎倉儲而避免出現反模式呢?

我思倉儲模式

在進行改造之前,我們思考兩個潛在需要解決的重點問題

其一,每一個具體業務倉儲實現,定義倉儲接口是一定必要的嗎?我認為完全沒必要,有的童鞋就疑惑了,若我們有非封裝基礎通用接口,需額外定義,那怎么搞,我們可以基于基礎倉儲接口定義擴展方法

其二,若與其他倉儲進行互操作,此時基礎倉儲不滿足需求,那怎么搞,我們可以在基礎倉儲接口中定義暴露獲取上下文Set屬性

其三,若非常復雜的查詢,可通過底層連接實現或引入Dapper

首先,我們保持上述封裝基礎倉儲接口前提下添加暴露上下文Set屬性,如下:

  1. /// <summary> 
  2. /// 基礎通用接口 
  3. /// </summary> 
  4. /// <typeparam name="TEntity"></typeparam> 
  5. public interface IRepository<T> where T : class 
  6.     IQueryable<T> Queryable { get; } 
  7.     T GetById(object id); 

上述我們將基礎倉儲接口具體實現類,將其定義為抽象,既然我們封裝了針對基礎倉儲接口的實現,外部只需調用即可,那么該類理論上就不應該被繼承,所以接下來我們將其修飾為密封類,如下:

  1. public sealed class EntityRepository<T> : IRepository<T> where T : class 
  2.     private readonly DbContext _context; 
  3.  
  4.     public EntityRepository(DbContext context) 
  5.     { 
  6.         _context = context; 
  7.     } 
  8.  
  9.     public T GetById(object id) 
  10.     { 
  11.         return _context.Set<T>().Find(id); 
  12.     } 

我們從容器中獲取上下文并進一步暴露上下文Set屬性

  1. public sealed class EntityRepository<T> : IRepository<T> where T : class 
  2.     private readonly IServiceProvider _serviceProvider; 
  3.  
  4.     private EFCoreDbContext _context => (EFCoreDbContext) 
  5.         _serviceProvider.GetService(typeof(EFCoreDbContext)); 
  6.  
  7.     private DbSet<T> Set => _context.Set<T>(); 
  8.  
  9.     public IQueryable<T> Queryable => Set
  10.  
  11.     public EntityRepository(IServiceProvider serviceProvider) 
  12.     { 
  13.         _serviceProvider = serviceProvider; 
  14.     } 
  15.  
  16.     public T GetById(object id) 
  17.     { 
  18.         return Set.Find(id); 
  19.     } 

若為基礎倉儲接口不滿足實現,則使用具體倉儲的擴展方法

  1. public static class UserRepository 
  2.     public static List<User> Other(this IRepository<User> repository) 
  3.     { 
  4.         // 自定義其他實現 
  5.     } 

最后到了服務層,則是我們的業務層,我們只需要使用上述基礎倉儲接口或擴展方法即可

  1. public class UserService 
  2.     private readonly IRepository<User> _repository; 
  3.     public UserService(IRepository<User>  repository) 
  4.     { 
  5.         _repository = repository; 
  6.     } 

最后在注入時,我們將省去注冊每一個具體倉儲實現,如下:

  1. services.AddDbContext<EFCoreDbContext>(options => 
  2.     options.UseSqlServer(@"Server=.;Database=EFCore;Trusted_Connection=True;"); 
  3. }); 
  4.  
  5. services.AddScoped(typeof(IRepository<>), typeof(EntityRepository<>)); 
  6.  
  7. services.AddScoped<UserService>(); 

以上只是針對第一種反模式的基本改造,對于UnitOfWork同理,其本質不過是管理操作事務,并需我們手動管理上下文釋放時機就好,這里就不再多講

我們還可以根據項目情況可進一步實現其對應規則,比如在是否需要在進行指定操作之前實現自定義擴展,比如再抽取一個上下文接口等等,ABP vNext中則是如此,ABP vNext對EF Core擴展是我看過最完美的實現方案,接下來我們來看看

ABP vNext倉儲模式

其核心在Volo.Abp.EntityFrameworkCore包中,將其單獨剝離出來除了抽象通用封裝外,還有一個則是調用了EF Core底層APi,一旦EF Core版本變動,此包也需同步更新

ABP vNext針對EF Core做了擴展,通過查看整體實現,主要通過擴展中特性實現指定屬性更新,EF Core中當模型被跟蹤時,直接提交則更新變化屬性,若未跟蹤,我們直接Update但想要更新指定屬性,這種方式不可行,在ABP vNext則得到了良好的解決

在其EF Core包中的AbpDbContext上下文中,針對屬性跟蹤更改做了良好的實現,如下:

  1. protected virtual void ChangeTracker_Tracked(object sender, EntityTrackedEventArgs e) 
  2.     FillExtraPropertiesForTrackedEntities(e); 
  3.  
  4. protected virtual void FillExtraPropertiesForTrackedEntities(EntityTrackedEventArgs e) 
  5.     var entityType = e.Entry.Metadata.ClrType; 
  6.     if (entityType == null
  7.     { 
  8.         return
  9.     } 
  10.  
  11.     if (!(e.Entry.Entity is IHasExtraProperties entity)) 
  12.     { 
  13.         return
  14.     } 
  15.      
  16.     ..... 

除此之外的第二大亮點則是對UnitOfWork(工作單元)的完美方案,將其封裝在Volo.Abp.Uow包中,通過UnitOfWorkManager管理UnitOfWork,其事務提交不簡單是像如下形式

  1. private IDbContextTransaction _transaction;  
  2. public void BeginTransaction() 
  3. {  
  4.     _transaction = Database.BeginTransaction(); 
  5.  
  6. public void Commit() 
  7.     try 
  8.     { 
  9.         SaveChanges(); 
  10.         _transaction.Commit(); 
  11.     } 
  12.     finally 
  13.     { 
  14.         _transaction.Dispose(); 
  15.     }         
  16.  
  17. public void Rollback() 
  18. {  
  19.     _transaction.Rollback(); 
  20.     _transaction.Dispose(); 

額外的還實現了基于環境流動的事務(AmbientUnitOfWork),反正ABP vNext在EF Core這塊擴展實現令人嘆服,我也在持續學習中,其他就不多講了,博客園中講解原理的文章比比皆是

 

責任編輯:武曉燕 來源: JeffckyShare
相關推薦

2019-06-06 08:30:07

區塊鏈數字貨幣比特幣

2012-07-02 09:40:45

小米手機

2020-02-25 16:30:36

MD5是不是加密

2019-02-27 09:28:15

Redis服務器事務

2024-07-05 09:00:00

編程語言Rust開發

2021-08-02 14:48:15

云電腦Windows 365華為

2024-02-07 12:35:00

React并發模式concurrent

2016-12-23 09:04:56

大數據技術BAT

2020-10-21 10:54:07

物聯網商業技術

2019-12-16 09:42:38

PHP語言程序員

2021-04-13 10:35:13

網盤存儲硬盤

2021-03-10 13:42:27

筆記本雙屏設計

2023-10-30 18:59:38

REST API開發

2017-09-07 14:44:10

程序員

2024-09-23 08:30:48

2020-07-14 16:22:50

滴滴自動駕駛傳感器

2021-01-11 13:32:14

比特幣加密貨幣區塊鏈

2011-05-24 09:30:26

Findbugs

2023-09-13 11:58:17

云原生反模式

2020-06-17 07:37:35

5G4G應用
點贊
收藏

51CTO技術棧公眾號

136导航精品福利| 麻豆电影在线播放| 国产一区二区精品| 亚洲视频在线播放| av在线无限看| 91麻豆一二三四在线| 国产精品一区三区| 538国产精品一区二区在线| 欧美18—19性高清hd4k| 精品入口麻豆88视频| 婷婷久久综合九色国产成人 | 91在线视频观看| 国产美女被下药99| av资源吧首页| 成人综合专区| 精品成人一区二区三区四区| www日韩在线观看| 欧美人与禽性xxxxx杂性| 久久久久久亚洲综合| 91网站在线免费观看| 黑人一级大毛片| 亚洲色图欧美| 国产午夜精品一区二区三区| 久久久久99人妻一区二区三区| 成人免费网站视频| 亚洲一区免费视频| 中文字幕一区综合| 免费a级毛片在线观看| 国产精品一区二区果冻传媒| 国产精品久久久久久久9999| 久久精品国产亚洲av无码娇色| 久久性感美女视频| 精品视频www| 久久无码专区国产精品s| 色猫猫成人app| 欧美视频国产精品| av在线免费观看国产| 免费高清在线观看| 国产日韩精品一区二区三区| 久久99国产精品| 国产成人三级在线观看视频| 精品亚洲欧美一区| 国产精品黄色av| 亚洲第一在线播放| 精品1区2区3区4区| 久热精品视频在线免费观看| www..com.cn蕾丝视频在线观看免费版 | 综合色天天鬼久久鬼色| 欧美高清视频一区二区三区在线观看| 精品人妻伦一二三区久久| 蜜桃av噜噜一区二区三区小说| 91福利视频网| 精品国产免费观看| 日韩视频在线一区二区三区| 色综合久久悠悠| 欧美久久久久久久久久久久| 91精品国产91久久久久久黑人| 色偷偷偷综合中文字幕;dd| 丰腴饱满的极品熟妇| 免费福利视频一区| 亚洲精品天天看| 成人片黄网站色大片免费毛片| 色综合www| 亚洲欧洲自拍偷拍| 97在线观看免费视频| 日韩一区亚洲二区| 日韩在线播放视频| 国产suv一区二区三区| 中文av一区| 欧美精品日韩www.p站| 2021亚洲天堂| 国内激情久久| 57pao成人永久免费视频| 国产又色又爽又黄的| 亚洲免费婷婷| 国产精品久久久久久久9999| 国产精品视频在线观看免费| 国产精品系列在线观看| 激情小说网站亚洲综合网| 日韩黄色影片| 中文一区二区完整视频在线观看| 亚洲午夜高清视频| 性欧美video高清bbw| 亚洲成av人片在线| 国产97色在线 | 日韩| 国产激情欧美| 日韩精品一区二区三区四区视频| 影音先锋人妻啪啪av资源网站| 亚洲成aⅴ人片久久青草影院| 国产一区二区三区视频免费| 亚洲熟女少妇一区二区| 欧美日韩免费| 国产91网红主播在线观看| 中文字幕在线观看国产| 国产成人av自拍| 韩国成人av| 欧美三级黄网| 亚洲动漫第一页| 超碰在线97免费| 日韩精品一区二区三区中文在线 | 你懂的在线观看视频网站| 国产精品伦一区二区三级视频| 欧美日韩一区二区三区电影| 99thz桃花论族在线播放| 欧美视频一区二区三区四区| 亚洲911精品成人18网站| 国产欧美一区二区三区精品观看 | 激情无码人妻又粗又大| 亚洲性视频h| 国产精品一区=区| 日本激情视频网站| 国产精品久久久久一区| 国内精品在线观看视频| 亚洲最大的免费视频网站| 日韩国产欧美区| 懂色av懂色av粉嫩av| 日韩精品成人一区二区三区| a级国产乱理论片在线观看99| av资源网在线观看| 精品欧美aⅴ在线网站| 色一情一区二区三区| 久久不见久久见国语| 欧美精品久久久久久久| 一二三四区在线| 国产亚洲va综合人人澡精品| 日本人体一区二区| 国产精品亚洲欧美日韩一区在线| 亚洲日本中文字幕免费在线不卡| 久久精品女人毛片国产| 国产在线精品一区二区不卡了| 日本不卡一区二区三区在线观看| av毛片午夜不卡高**水| 日韩美一区二区三区| 999精品在线视频| 日本午夜精品视频在线观看| 美女视频久久| 成人免费网站观看| 精品国产污污免费网站入口 | 日韩精品dvd| 国产69久久精品成人看| 欧美一级淫片aaaaaa| 一区二区三区在线视频观看58| 亚洲欧美国产中文| 成人av资源电影网站| 全亚洲最色的网站在线观看| 香蕉av一区二区三区| 亚洲在线视频网站| 国产免费无码一区二区| 欧美二区视频| 91久久久一线二线三线品牌| 成人在线免费看片| 欧美一区二区三区思思人| 国产精品久久久免费看| 久久9热精品视频| 亚洲一区二区三区午夜| 欧美另类激情| 久久精品中文字幕免费mv| ,亚洲人成毛片在线播放| 国产精品国产精品国产专区不蜜| 亚洲免费999| 亚洲综合五月| 超碰在线观看97| av资源在线播放| 日韩国产欧美精品一区二区三区| 午夜精品久久久久久久久久久久久蜜桃| 不卡的看片网站| 日韩在线综合网| 免费成人结看片| 国产精品69av| 在线观看免费网站黄| 欧美剧在线免费观看网站| 91日韩中文字幕| 不卡区在线中文字幕| 日韩av片在线看| 成人羞羞网站入口| 成人午夜在线影院| 国产不卡123| 亚洲性夜色噜噜噜7777| 夜夜躁狠狠躁日日躁av| 一区二区三区久久| 色婷婷精品久久二区二区密| 久久国产66| 四虎影院一区二区| 黄色网一区二区| 国产精品白嫩美女在线观看| av在线看片| 日韩成人在线电影网| 中文字幕一区二区三区四区视频| 亚洲免费毛片网站| 五级黄高潮片90分钟视频| 奇米亚洲午夜久久精品| 九一免费在线观看| 综合干狼人综合首页| 国产在线日韩在线| 国产三级电影在线播放| 在线视频欧美日韩精品| www.香蕉视频| 色一区在线观看| 青春草免费视频| 久久欧美中文字幕| 欧美人与性动交α欧美精品| 另类天堂av| 国产成人一二三区| 欧美亚洲精品在线| 国产精品一码二码三码在线| 成人在线视频免费看| 色综合天天综合网国产成人网| 久草在线青青草| 日韩精品一区国产麻豆| 日批视频免费观看| 午夜视频一区二区三区| 97精品在线播放| 久久久青草青青国产亚洲免观| 男人女人拔萝卜视频| 日产国产高清一区二区三区| www.av91| 欧美福利专区| 亚洲韩国在线| 亚洲免费福利一区| 成人做爰66片免费看网站| 国产精品传媒麻豆hd| 2020国产精品视频| 成人性生交大片免费看网站| www.欧美免费| 国产精品一区在线看| 亚洲电影av在线| jizz中国少妇| 欧美另类z0zxhd电影| 中文字幕xxxx| 狠狠爱在线视频一区| 国产一二三四在线| 亚洲美女免费视频| 国产3级在线观看| 国产欧美日韩另类一区| 性久久久久久久久久| 99久久久精品| 妖精视频一区二区| 福利电影一区二区| 中文字幕在线观看视频www| 精品在线播放午夜| 欧美成人三级在线播放| 日本一区中文字幕| 免费看黄色一级大片| 麻豆91精品| 东京热加勒比无码少妇| 国产人成精品一区二区三| 91丨porny丨探花| 在线观看的日韩av| 人人妻人人添人人爽欧美一区| 亚洲福利专区| 日日碰狠狠添天天爽超碰97| 国产精品外国| 欧美成人精品欧美一级乱| 国产亚洲亚洲| 色婷婷综合久久久久中文字幕| 免费日韩一区二区| 五月天婷婷激情视频| 日韩综合在线视频| 91精品无人成人www| 免费在线观看精品| 日本中文字幕观看| 国产剧情一区二区三区| 一卡二卡三卡四卡五卡| 成人综合婷婷国产精品久久 | 香蕉大人久久国产成人av| 91丨九色丨国产| 国产精品男女| 开心色怡人综合网站| 精品一二三区| 最新不卡av| 欧美日本二区| 精品这里只有精品| 日韩av一级片| 亚洲精品无码久久久久久久| 丁香天五香天堂综合| 亚洲蜜桃精久久久久久久久久久久| 久久精品一区二区三区不卡| 成人午夜福利一区二区| 中文字幕在线免费不卡| 免费人成视频在线| 色一区在线观看| 国产精品久久久久久久久久久久久久久久久久 | 久久精品无码人妻| 色婷婷激情综合| 又骚又黄的视频| 日韩欧美国产综合一区| 色欲av伊人久久大香线蕉影院| 亚洲午夜精品久久久久久久久久久久| 免费a级在线播放| 久久久久久高潮国产精品视| 欧美大片免费观看网址| 成人网欧美在线视频| 欧美aaaaaaaa牛牛影院| 亚洲精品国产精品国自产| 中文精品久久| 乱子伦视频在线看| 国产精品主播直播| av黄色免费网站| 夜夜亚洲天天久久| 最近中文字幕免费在线观看| 欧美成人官网二区| av在线三区| 高清一区二区三区四区五区| 日韩成人亚洲| 国内视频一区二区| 91成人免费| 国产成人手机视频| 波多野结衣中文字幕一区 | 国产一区二区三区站长工具| 欧美交换配乱吟粗大25p| 久久久久免费| 久久人妻少妇嫩草av蜜桃| 国产欧美精品国产国产专区| 免费观看一级视频| 91精品久久久久久久91蜜桃| 黑人与亚洲人色ⅹvideos| 欧美激情国产精品| 亚洲免费看片| 日本成人看片网址| 一区二区三区四区五区在线| 日本一区二区三区在线免费观看| 国产视频一区二区在线| 国产精品99精品无码视| 欧美一区二区三级| 在线播放毛片| 国产黑人绿帽在线第一区| 另类春色校园亚洲| www婷婷av久久久影片| 久草在线在线精品观看| 欧美偷拍一区二区三区| 精品高清一区二区三区| 亚洲高清视频在线播放| 美日韩丰满少妇在线观看| 国产资源一区| 亚洲高清资源综合久久精品| 久久精品在线| av网站免费在线播放| 精品国产91久久久久久| 六月婷婷中文字幕| 久久久久国产精品免费| 中文字幕视频精品一区二区三区| 法国空姐在线观看免费| 精品中文字幕一区二区小辣椒| 卡一卡二卡三在线观看| 欧美综合久久久| 丁香婷婷在线观看| 国产精品视频男人的天堂| 精品一区毛片| 无遮挡又爽又刺激的视频| 久久久一区二区三区| 国产乱国产乱老熟| 亚洲乱码一区av黑人高潮 | 欧美gvvideo网站| 国产色视频在线播放| 中文字幕一区在线观看| 国产农村老头老太视频| 久久成人综合视频| 香蕉大人久久国产成人av| 免费视频爱爱太爽了| 成人av影院在线| 欧美精品二区三区| 亚洲丝袜在线视频| 国产精品成人国产| 91成人在线视频观看| 国产sm精品调教视频网站| 国产无套粉嫩白浆内谢| 亚洲精品久久久久久久久| 惠美惠精品网| 亚洲第一导航| 国产精品一区二区免费不卡| 国产在线视频在线观看| 亚洲码在线观看| 99久久精品一区二区成人| 亚洲国产欧洲综合997久久| 韩国精品在线观看| 久久久久亚洲av无码专区 | 久久亚洲天堂| 99在线热播| 亚洲欧美日韩国产一区二区| 无码少妇一区二区| 91精品国产综合久久精品麻豆| av有码在线观看| 色综合电影网| 国产成人在线影院| 无码无套少妇毛多18pxxxx| 久久精品国亚洲| 果冻天美麻豆一区二区国产| 欧美精品第三页| 亚洲欧美色综合| 日本中文字幕一区二区有码在线| 日韩免费精品视频| 亚洲精品电影| 国产精品揄拍100视频| 在线播放视频一区| 亚洲永久av| 国产女主播av| 久久久久亚洲蜜桃| 亚洲国产欧美另类| 国产精品成人一区二区三区吃奶| 午夜精品999|