精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲精品美女91| 精品91福利视频| 久久先锋影音av| 国产一区二区在线播放| 久久久久亚洲AV成人| 成人午夜网址| 欧美性色黄大片| 欧美性受黑人性爽| 头脑特工队2在线播放| 久久久久国产精品一区二区| 久久久国产精品免费| 中文视频在线观看| 国产伊人久久| 欧美性xxxxx极品娇小| 一区二区三区四区在线视频| 丰满人妻一区二区三区四区53 | 日韩欧美一区二区三区在线观看| **网站欧美大片在线观看| 国产区日韩欧美| 国产精品一级视频| 久久深夜福利| 97精品久久久| 欧美爱爱免费视频| 亚洲精品进入| 日韩免费观看高清完整版| 9久久婷婷国产综合精品性色| 污的网站在线观看| 中日韩av电影| 日韩精品电影网站| 婷婷婷国产在线视频| 国产激情视频一区二区三区欧美 | 日韩乱码人妻无码中文字幕| 婷婷亚洲综合| 日韩av中文字幕在线| 天天色天天干天天色| 黑人巨大精品| 第一福利永久视频精品| 亚洲 欧美 综合 另类 中字| sm国产在线调教视频| 中文字幕国产一区二区| 欧美在线一二三区| 欧美孕妇性xxxⅹ精品hd| 成人精品国产免费网站| 波多野结衣久草一区| 99久久亚洲精品日本无码| 日本va欧美va瓶| 国产精品久久激情| 中文字幕 亚洲视频| 日韩avvvv在线播放| 国产精品jvid在线观看蜜臀| 影音先锋在线国产| 美女日韩在线中文字幕| 日韩免费在线播放| 天天干天天干天天干天天| 一区二区日韩免费看| 91精品国产成人www| 国产香蕉视频在线| 一二三区精品| 4p变态网欧美系列| 无码人妻精品一区二区蜜桃色欲| 另类国产ts人妖高潮视频| 秋霞av国产精品一区| 东京热一区二区三区四区| 男人天堂欧美日韩| 国产精品久久久久久av福利| 中文字幕在线观看免费| 精品一区二区三区影院在线午夜 | 欧美日韩亚洲第一| 日韩高清成人| 欧美日韩另类国产亚洲欧美一级| 久久久久久久久久久久久久久国产| 日韩精品一级毛片在线播放| 91精品国产综合久久精品图片| 国产探花在线观看视频| a看欧美黄色女同性恋| 亚洲精品国产欧美| 摸摸摸bbb毛毛毛片| 天天综合网91| 久久久午夜视频| 99热只有这里有精品| 水蜜桃久久夜色精品一区的特点| 国产精品在线看| 国产高清精品软件丝瓜软件| aaa国产一区| 日韩精品一区二区三区色偷偷| av影片在线看| 洋洋成人永久网站入口| 国产精品秘入口18禁麻豆免会员| 久久精品超碰| 欧美精品一区二区在线观看| 国产伦理片在线观看| 午夜激情一区| 日韩美女免费视频| 精品黑人一区二区三区在线观看| www久久精品| 青春草在线视频免费观看| zzzwww在线看片免费| 欧美色区777第一页| 午夜视频在线免费看| 国产精品一区二区av交换| 欧美成人免费小视频| 亚洲高清毛片一区二区| 国产精品影视在线观看| 欧美日韩综合精品| av大全在线| 欧美午夜片在线看| www.17c.com喷水少妇| 999久久久亚洲| 欧美中文字幕精品| 99视频在线观看免费| 国产欧美久久久精品影院| 日韩在线视频在线| 国产精品传媒麻豆hd| 日韩精品中文字幕在线| 欧美精品一区二区成人| 麻豆极品一区二区三区| 精品欧美日韩在线| 18av在线播放| 欧美男男青年gay1069videost| 亚洲av成人无码一二三在线观看| 66视频精品| 国产精品久久av| 久青青在线观看视频国产| 亚洲成人免费在线观看| 一级黄色高清视频| 日韩黄色大片网站| 国产精品成人免费视频| 偷拍自拍在线| 精品福利视频导航| 无码人妻丰满熟妇区毛片蜜桃精品| 欧美自拍偷拍| 国产精品av在线播放| 日韩精品一二| 精品成人av一区| 精品中文字幕在线播放| 亚洲先锋成人| 亚洲一区二区三| 日本精品一区二区三区在线播放| 91激情在线视频| 中文字幕在线免费看线人| 影音先锋久久资源网| 99视频免费观看| 青草在线视频| 精品乱人伦小说| 日本天堂在线视频| 北条麻妃国产九九精品视频| 免费的一级黄色片| 成人三级av在线| 国产综合在线看| 天天综合天天色| 激情成人中文字幕| 青青草福利视频| 日韩精品电影在线| 日韩欧美第二区在线观看| 成人看片在线观看| 色老头一区二区三区在线观看| 中文字幕二区三区| 国产精品理论片| 奇米777在线| 国产精品va| 国产一区二区三区无遮挡| 欧美伦理91| 亚洲午夜av电影| 亚洲在线免费观看视频| 亚洲免费av在线| 老熟女高潮一区二区三区| 在线不卡亚洲| 欧美在线视频一区二区三区| 久久精品97| 欧美乱人伦中文字幕在线| 日本精品久久久久久| 日韩欧美亚洲范冰冰与中字| 日韩黄色中文字幕| 国产成人在线观看| 菠萝蜜视频在线观看入口| 欧美精品中文字幕亚洲专区| 国产97在线播放| 黄色视屏免费在线观看| 精品国产三级电影在线观看| 精品人妻一区二区色欲产成人| 国产三级一区二区三区| 午夜xxxxx| 国产日韩1区| 三区精品视频| 欧美区一区二区| 欧美最猛性xxxxx(亚洲精品)| 成年午夜在线| 亚洲成人黄色在线| 亚洲精品男人的天堂| 亚洲视频狠狠干| 51调教丨国产调教视频| 久久99精品久久久久久动态图| 免费不卡av在线| 大色综合视频网站在线播放| 99久久精品久久久久久ai换脸| 樱桃视频成人在线观看| 精品久久久av| 精品欧美不卡一区二区在线观看| 91精品国产综合久久香蕉麻豆 | 3d玉蒲团在线观看| 亚洲精品自产拍| 精品人妻一区二区三区蜜桃| 在线影视一区二区三区| 在线看成人av| 最新不卡av在线| 91精品人妻一区二区| 国产激情91久久精品导航 | 国产午夜精品一区二区三区| 亚洲国产精彩视频| 精品污污网站免费看| 五月天婷婷综合网| 亚洲免费av高清| www..com.cn蕾丝视频在线观看免费版| 国产乱码一区二区三区| 欧美三级理论片| 宅男噜噜噜66一区二区| 国产精品igao激情视频| 四虎国产精品免费观看| 欧美午夜精品久久久久久蜜| 高潮按摩久久久久久av免费| 成人午夜激情免费视频| 人人鲁人人莫人人爱精品| 韩国福利视频一区| 男女在线视频| 久久在线免费观看视频| 最新国产在线观看| 国产亚洲精品久久久久久777| 亚洲av成人精品一区二区三区在线播放 | 国产色99精品9i| 国产精品露脸自拍| 日本综合字幕| 欧美又大又粗又长| 蜜桃视频在线网站| 久久久久久久久久久成人| h片在线免费观看| 久久久91精品| 国产网友自拍视频导航网站在线观看| 国产午夜精品全部视频播放| 九九在线视频| 亚洲天堂影视av| 国产香蕉在线| 伊人青青综合网站| 成人高清网站| 最新国产精品亚洲| 日韩精品毛片| 精品激情国产视频| 黄色网页在线免费观看| 欧美另类第一页| 四虎影院观看视频在线观看| 欧美激情在线观看| 超碰97国产精品人人cao| 韩国19禁主播vip福利视频| 少妇在线看www| 日韩**中文字幕毛片| 日韩中文影院| 国产精品一二区| 91国产一区| 7777精品伊久久久大香线蕉语言 | 黄视频网站在线观看| 91高清在线免费观看| 夜鲁夜鲁夜鲁视频在线播放| 日本在线观看天堂男亚洲| 日韩制服一区| 成人字幕网zmw| 北条麻妃一区二区三区在线观看| 97久久天天综合色天天综合色hd | 国产成人综合网| 成人做爰www看视频软件| a亚洲天堂av| 国产毛片久久久久久久| 亚洲欧美一区二区视频| 国产在线拍揄自揄拍| 色综合一区二区三区| 一级片在线免费观看视频| 日韩一区二区三区免费看 | 成人免费一区二区三区| 69堂精品视频| 天堂在线观看av| 中文字幕日韩在线观看| 性欧美高清come| 秋霞av国产精品一区| 97色婷婷成人综合在线观看| 国产在线精品一区| 成人av国产| 日韩黄色短视频| 麻豆一区二区99久久久久| 国产综合内射日韩久| 国产欧美综合在线| 久久久无码精品亚洲国产| 色天使色偷偷av一区二区| 国产精品-色哟哟| 日韩精品极品在线观看播放免费视频| 1区2区3区在线观看| 18性欧美xxxⅹ性满足| 一级欧美视频| 欧美日韩精品久久久免费观看| 911精品美国片911久久久| a√天堂在线观看| 国产精品亚洲午夜一区二区三区| 女尊高h男高潮呻吟| 亚洲美女屁股眼交3| 日韩熟女一区二区| 欧美sm美女调教| 日本在线天堂| 日韩免费视频在线观看| 成人三级av在线| 中国一级黄色录像| 视频一区国产视频| 久久久久成人精品无码中文字幕| 亚洲欧美在线另类| 中文人妻av久久人妻18| 亚洲国内高清视频| 午夜dj在线观看高清视频完整版 | 91片黄在线观看喷潮| 精品视频中文字幕| 国产桃色电影在线播放| 91免费电影网站| 日韩av有码| 欧美黄色一级片视频| 99久久精品国产麻豆演员表| 国产女片a归国片aa| 欧美精品色一区二区三区| 国产小视频在线播放| 91大神福利视频在线| 国产精品极品在线观看| 青青青青在线视频| 国产精品夜夜嗨| 538精品在线观看| 欧美一区二区久久久| 日韩精品成人av| 国产在线视频91| 日韩成人免费| 性刺激的欧美三级视频| 久久久久久毛片| 国产精品黄色网| 精品日韩在线观看| 欧美aaaaaaa| 国产精品乱码| 亚洲激情专区| 天天躁日日躁狠狠躁免费麻豆| 亚洲自拍偷拍网站| www久久久久久| 欧美激情第一页xxx| 亚洲精品国产九九九| 激情五月婷婷六月| 成人美女在线视频| 日韩欧美一区二区一幕| 亚洲国产精品推荐| 亚洲电影观看| 欧美一区二区三区成人久久片| 老司机午夜精品视频| 久久中文字幕精品| 欧美日韩一区不卡| 黄色av免费在线| 999在线免费观看视频| 国内精品美女在线观看| 亚洲av人人澡人人爽人人夜夜| 亚洲va欧美va人人爽| 日本一区高清| 国产精品人成电影在线观看| 欧美激情黄色片| 欧美熟妇精品一区二区| 亚洲mv在线观看| 每日更新在线观看av| 国产在线视频2019最新视频| 国产精品豆花视频| 亚洲午夜久久久久久久久红桃| 日本高清无吗v一区| 黄色在线论坛| 国产精品自拍首页| 可以看av的网站久久看| 超碰97av在线| 亚洲精品在线电影| 校园春色亚洲色图| 中文一区一区三区免费| 国产成人h网站| 日日骚av一区二区| 久久精品这里热有精品| 老牛国内精品亚洲成av人片| 日韩欧美精品在线观看视频| 国产精品天干天干在观线 | 国产视频在线一区二区| 99蜜月精品久久91| 欧美一区二区三区综合| 久久久久久97三级| 国产成人麻豆精品午夜在线| 午夜免费日韩视频| 久久国产亚洲精品| www.17c.com喷水少妇| 欧美日韩免费一区二区三区视频| 国模雨婷捆绑高清在线| 色狠狠久久av五月综合| 成人在线视频一区| 亚洲一区精品在线观看| 97免费在线视频| 国产精品99一区二区三区| 亚洲久久久久久| 日韩一区二区三区三四区视频在线观看| 松下纱荣子在线观看| 欧洲金发美女大战黑人|