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

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

在ABP中,倉儲類要實現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,可自行參考。
ABP入門系列目錄——學習Abp架構之實操演練

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

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.