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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

一、先來介紹下倉儲

倉儲(Repository): 倉儲用來操作數據庫進行數據存取。倉儲接口在領域層定義,而倉儲的實現類應該寫在基礎設施層。

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

IRepository接口定義的方法

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

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

直接通過在應用服務層定義倉儲引用,然后通過構造函數注入即可。在我們的應用服務層即可按以下方式使用Task倉儲:

?

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

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

二、如何實現自定義倉儲

假設我們需要查找某個用戶都分配哪些任務。

  • 在領域層,創建IRepositories文件夾,然后定義IBackendTaskRepository。
  • ?

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

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

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

    自定義倉儲的代碼路徑

    三、倉儲的注意事項

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

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



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

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。