首頁  >  文章  >  後端開發  >  ABP入門系列(4)-領域層定義倉儲並實現

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

黄舟
黄舟原創
2017-01-16 17:26:382998瀏覽

倉儲(Repository): 倉儲用來操作資料庫進行資料存取。倉儲介面在領域層定義,而倉儲的實作類別應該寫在基礎設施層。

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


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

ABP針對不同的ORM框架對該介面給予了預設的實作;
針對EntityFramework,提供了EfRepositoryBase的泛型版本的實作方式。
針對NHibernate,提供了NhRepositoryBase的泛型版本的實作方式。

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

直接透過在應用服務層定義倉儲引用,然後透過建構函式註入即可。在我們的應用程式服務層即可以以下方式使用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入門系列(4)-領域層定義倉儲並實現


三、倉儲的注意事項

倉儲方法中,ABP自動進行資料庫連線的開啟與關閉。

倉儲方法被呼叫時,資料庫連線會自動開啟且啟動事務。

當倉儲方法呼叫另一個倉儲的方法,它們實際上共享的是同一個資料庫連接和事務。

倉儲物件都是暫時性的,因為IRepository介面預設繼承自ITransientDependency介面。所以,倉儲物件只有在需要注入的時候,才會由Ioc容器自動建立新實例。

預設的泛型倉儲能滿足我們大部分的需求。只有在不滿足的情況下,才創建客製化的倉儲。

原始碼已上傳至Github-LearningMpaAbp,可自行參考。
ABP入門系列目錄-學習Abp框架之實操演練

以上就是ABP入門系列(4)-領域層定義倉儲並實現的內容,更多相關內容請關注PHP中文網(www.php.cn )!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn