(轉(zhuǎn))ABP入門系列(3)——領(lǐng)域?qū)佣x倉儲(chǔ)并實(shí)現(xiàn)

一咨跌、先來介紹下倉儲(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接口加酵,接口定義了常用的增刪改查以及聚合方法拳喻,其中包括同步及異步方法。主要包括以下方法:

image

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ù)猎物。

  1. 在領(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);
    }
}

  1. 在基礎(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ù)。

image

三炼邀、倉儲(chǔ)的注意事項(xiàng)

  1. 倉儲(chǔ)方法中魄揉,ABP自動(dòng)進(jìn)行數(shù)據(jù)庫連接的開啟和關(guān)閉。
  2. 倉儲(chǔ)方法被調(diào)用時(shí)拭宁,數(shù)據(jù)庫連接自動(dòng)開啟且啟動(dòng)事務(wù)洛退。
  3. 當(dāng)倉儲(chǔ)方法調(diào)用另外一個(gè)倉儲(chǔ)的方法,它們實(shí)際上共享的是同一個(gè)數(shù)據(jù)庫連接和事務(wù)杰标。
  4. 倉儲(chǔ)對(duì)象都是暫時(shí)性的兵怯,因?yàn)镮Repository接口默認(rèn)繼承自ITransientDependency接口。所以腔剂,倉儲(chǔ)對(duì)象只有在需要注入的時(shí)候媒区,才會(huì)由Ioc容器自動(dòng)創(chuàng)建新實(shí)例。
  5. 默認(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)并注明出處宙攻。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市介褥,隨后出現(xiàn)的幾起案子座掘,更是在濱河造成了極大的恐慌,老刑警劉巖柔滔,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溢陪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡睛廊,警方通過查閱死者的電腦和手機(jī)形真,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喉前,“玉大人没酣,你說我怎么就攤上這事王财。” “怎么了裕便?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵绒净,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我偿衰,道長(zhǎng)挂疆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任下翎,我火速辦了婚禮缤言,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘视事。我一直安慰自己胆萧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布俐东。 她就那樣靜靜地躺著跌穗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虏辫。 梳的紋絲不亂的頭發(fā)上蚌吸,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音砌庄,去河邊找鬼羹唠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛娄昆,可吹牛的內(nèi)容都是我干的佩微。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼稿黄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼喊衫!你這毒婦竟也來了跌造?” 一聲冷哼從身側(cè)響起杆怕,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壳贪,沒想到半個(gè)月后陵珍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡违施,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年互纯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磕蒲。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡留潦,死狀恐怖只盹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兔院,我是刑警寧澤殖卑,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站坊萝,受9級(jí)特大地震影響孵稽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜十偶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一菩鲜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惦积,春花似錦接校、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至厉亏,卻和暖如春董习,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爱只。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工皿淋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恬试。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓窝趣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親训柴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哑舒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容