一咨跌、先來介紹下倉儲(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
接口加酵,接口定義了常用的增刪改查以及聚合方法拳喻,其中包括同步及異步方法。主要包括以下方法:
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ù)猎物。
- 在領(lǐng)域?qū)樱瑒?chuàng)建IRepositories文件夾角塑,然后定義IBackendTaskRepository蔫磨。
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);
}
}
- 在基礎(chǔ)架構(gòu)層,實(shí)現(xiàn)該倉儲(chǔ)圃伶。
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ǔ)的注意事項(xiàng)
- 倉儲(chǔ)方法中魄揉,ABP自動(dòng)進(jìn)行數(shù)據(jù)庫連接的開啟和關(guān)閉。
- 倉儲(chǔ)方法被調(diào)用時(shí)拭宁,數(shù)據(jù)庫連接自動(dòng)開啟且啟動(dòng)事務(wù)洛退。
- 當(dāng)倉儲(chǔ)方法調(diào)用另外一個(gè)倉儲(chǔ)的方法,它們實(shí)際上共享的是同一個(gè)數(shù)據(jù)庫連接和事務(wù)杰标。
- 倉儲(chǔ)對(duì)象都是暫時(shí)性的兵怯,因?yàn)镮Repository接口默認(rèn)繼承自ITransientDependency接口。所以腔剂,倉儲(chǔ)對(duì)象只有在需要注入的時(shí)候媒区,才會(huì)由Ioc容器自動(dòng)創(chuàng)建新實(shí)例。
- 默認(rèn)的泛型倉儲(chǔ)能滿足我們大部分的需求掸犬。只有在不滿足的情況下袜漩,才創(chuàng)建定制化的倉儲(chǔ)。
作者:圣杰
鏈接:http://www.reibang.com/p/6e90a94aeba4
來源:簡(jiǎn)書
簡(jiǎn)書著作權(quán)歸作者所有湾碎,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處宙攻。