ABP入門系列(3)——領域層定義倉儲並實現


ABP入門系列目錄——學習Abp框架之實操演練

一、先來介紹下倉儲

倉儲(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; 
}

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

二、如何實現自定義倉儲

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

  1. 在領域層,創建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);
    }
}
  1. 在基礎架構層,實現該倉儲。
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傳給父類的構造函數。

自定義倉儲的代碼路徑

三、倉儲的注意事項

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM