ABP入门系列(3)——领域层定义仓储并实现
一、先來介紹下倉儲(chǔ)
倉儲(chǔ)(Repository): 倉儲(chǔ)用來操作數(shù)據(jù)庫進(jìn)行數(shù)據(jù)存取。倉儲(chǔ)接口在領(lǐng)域?qū)佣x,而倉儲(chǔ)的實(shí)現(xiàn)類應(yīng)該寫在基礎(chǔ)設(shè)施層。
在ABP中,倉儲(chǔ)類要實(shí)現(xiàn)IRepository接口,接口定義了常用的增刪改查以及聚合方法,其中包括同步及異步方法。主要包括以下方法:
IRepository接口定義的方法
ABP針對(duì)不同的ORM框架對(duì)該接口給予了默認(rèn)的實(shí)現(xiàn);
針對(duì)EntityFramework,提供了EfRepositoryBase<TDbContext, TEntity, TPrimaryKey>的泛型版本的實(shí)現(xiàn)方式。
針對(duì)NHibernate,提供了NhRepositoryBase<TEntity, TPrimaryKey>的泛型版本的實(shí)現(xiàn)方式。
泛型版本的實(shí)現(xiàn)就意味著,大多數(shù)的時(shí)候,這些方法已足已應(yīng)付一般實(shí)體的需要。如果這些方法對(duì)于實(shí)體來說已足夠,我們便不需要再去創(chuàng)建這個(gè)實(shí)體所需的倉儲(chǔ)接口/類。
直接通過在應(yīng)用服務(wù)層定義倉儲(chǔ)引用,然后通過構(gòu)造函數(shù)注入即可。在我們的應(yīng)用服務(wù)層即可按以下方式使用Task倉儲(chǔ):
?
public class TaskAppService : ITaskAppService { private readonly IRepository<Task> _taskRepository; public TaskAppService(IRepository<Task> taskRepository) { _taskRepository = taskRepository; }示例代碼中使用的就是這種方式。
二、如何實(shí)現(xiàn)自定義倉儲(chǔ)
假設(shè)我們需要查找某個(gè)用戶都分配哪些任務(wù)。
?
namespace LearningMpaAbp.IRepositories {/// <summary>/// 自定義倉儲(chǔ)示例/// </summary>public interface IBackendTaskRepository : IRepository<Task>{/// <summary>/// 獲取某個(gè)用戶分配了哪些任務(wù)/// </summary>/// <param name="personId">用戶Id</param>/// <returns>任務(wù)列表</returns>List<Task> GetTaskByAssignedPersonId(long personId);} }?
namespace LearningMpaAbp.EntityFramework.Repositories {public class BackendTaskRepository:LearningMpaAbpRepositoryBase<Task>,IBackendTaskRepository{public BackendTaskRepository(IDbContextProvider<LearningMpaAbpDbContext> dbContextProvider) : base(dbContextProvider){}/// <summary>/// 獲取某個(gè)用戶分配了哪些任務(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();}} }該倉儲(chǔ)實(shí)現(xiàn),繼承自模板生成的LearningMpaAbpRepositoryBase泛型抽象類,然后再實(shí)現(xiàn)IBackendTaskRepository接口。這里要顯示聲明實(shí)現(xiàn)類的有參構(gòu)造函數(shù),使用泛型的IDbContextProvider將數(shù)據(jù)庫上下文的子類ChargeStationContext傳給父類的構(gòu)造函數(shù)。
自定義倉儲(chǔ)的代碼路徑
三、倉儲(chǔ)的注意事項(xiàng)
源碼已上傳至Github-LearningMpaAbp,可自行參考。
作者:圣杰
鏈接:https://www.jianshu.com/p/6e90a94aeba4
來源:簡(jiǎn)書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
總結(jié)
以上是生活随笔為你收集整理的ABP入门系列(3)——领域层定义仓储并实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度钱包还信用卡失败怎么办
- 下一篇: 百度钱包申请信用卡额度是多少