日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ABP入门系列(3)——领域层定义仓储并实现

發(fā)布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ABP入门系列(3)——领域层定义仓储并实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、先來介紹下倉儲

倉儲(Repository): 倉儲用來操作數(shù)據(jù)庫進行數(shù)據(jù)存取。倉儲接口在領(lǐng)域?qū)佣x,而倉儲的實現(xiàn)類應(yīng)該寫在基礎(chǔ)設(shè)施層。

在ABP中,倉儲類要實現(xiàn)IRepository接口,接口定義了常用的增刪改查以及聚合方法,其中包括同步及異步方法。主要包括以下方法:

IRepository接口定義的方法

ABP針對不同的ORM框架對該接口給予了默認的實現(xiàn);
針對EntityFramework,提供了EfRepositoryBase<TDbContext, TEntity, TPrimaryKey>的泛型版本的實現(xiàn)方式。
針對NHibernate,提供了NhRepositoryBase<TEntity, TPrimaryKey>的泛型版本的實現(xiàn)方式。

泛型版本的實現(xiàn)就意味著,大多數(shù)的時候,這些方法已足已應(yīng)付一般實體的需要。如果這些方法對于實體來說已足夠,我們便不需要再去創(chuàng)建這個實體所需的倉儲接口/類。

直接通過在應(yīng)用服務(wù)層定義倉儲引用,然后通過構(gòu)造函數(shù)注入即可。在我們的應(yīng)用服務(wù)層即可按以下方式使用Task倉儲:

?

public class TaskAppService : ITaskAppService { private readonly IRepository<Task> _taskRepository; public TaskAppService(IRepository<Task> taskRepository) { _taskRepository = taskRepository; }

示例代碼中使用的就是這種方式。

二、如何實現(xiàn)自定義倉儲

假設(shè)我們需要查找某個用戶都分配哪些任務(wù)。

  • 在領(lǐng)域?qū)?#xff0c;創(chuàng)建IRepositories文件夾,然后定義IBackendTaskRepository。
  • ?

    namespace LearningMpaAbp.IRepositories {/// <summary>/// 自定義倉儲示例/// </summary>public interface IBackendTaskRepository : IRepository<Task>{/// <summary>/// 獲取某個用戶分配了哪些任務(wù)/// </summary>/// <param name="personId">用戶Id</param>/// <returns>任務(wù)列表</returns>List<Task> GetTaskByAssignedPersonId(long personId);} }
  • 在基礎(chǔ)架構(gòu)層,實現(xiàn)該倉儲。
  • ?

    namespace LearningMpaAbp.EntityFramework.Repositories {public class BackendTaskRepository:LearningMpaAbpRepositoryBase<Task>,IBackendTaskRepository{public BackendTaskRepository(IDbContextProvider<LearningMpaAbpDbContext> dbContextProvider) : base(dbContextProvider){}/// <summary>/// 獲取某個用戶分配了哪些任務(wù)/// </summary>/// <param name="personId">用戶Id</param>/// <returns>任務(wù)列表</returns>public List<Task> GetTaskByAssignedPersonId(long personId){var query = GetAll();if (personId>0){query = query.Where(t => t.AssignedPersonId == personId);}return query.ToList();}} }

    該倉儲實現(xiàn),繼承自模板生成的LearningMpaAbpRepositoryBase泛型抽象類,然后再實現(xiàn)IBackendTaskRepository接口。這里要顯示聲明實現(xiàn)類的有參構(gòu)造函數(shù),使用泛型的IDbContextProvider將數(shù)據(jù)庫上下文的子類ChargeStationContext傳給父類的構(gòu)造函數(shù)。

    自定義倉儲的代碼路徑

    三、倉儲的注意事項

  • 倉儲方法中,ABP自動進行數(shù)據(jù)庫連接的開啟和關(guān)閉。
  • 倉儲方法被調(diào)用時,數(shù)據(jù)庫連接自動開啟且啟動事務(wù)
  • 當倉儲方法調(diào)用另外一個倉儲的方法,它們實際上共享的是同一個數(shù)據(jù)庫連接和事務(wù)。
  • 倉儲對象都是暫時性的,因為IRepository接口默認繼承自ITransientDependency接口。所以,倉儲對象只有在需要注入的時候,才會由Ioc容器自動創(chuàng)建新實例。
  • 默認的泛型倉儲能滿足我們大部分的需求。只有在不滿足的情況下,才創(chuàng)建定制化的倉儲。

  • 源碼已上傳至Github-LearningMpaAbp,可自行參考。



    作者:圣杰
    鏈接:https://www.jianshu.com/p/6e90a94aeba4
    來源:簡書
    著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

    總結(jié)

    以上是生活随笔為你收集整理的ABP入门系列(3)——领域层定义仓储并实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。