abp(net core)+easyui+efcore倉儲系統——定義倉儲並實現 (四)

DotNet菜園發表於2019-06-14

abp(net core)+easyui+efcore倉儲系統目錄

abp(net core)+easyui+efcore倉儲系統——ABP總體介紹(一)

abp(net core)+easyui+efcore倉儲系統——解決方案介紹(二)

abp(net core)+easyui+efcore倉儲系統——領域層建立實體(三)

 

在上一篇文章中我們建立了Module實體並在資料庫中生成了資料表,在這一文章中我們介紹如何來對資料庫進行操作。

一、先來介紹下倉儲

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

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

 

ABP針對不同的ORM框架對這個介面進行了預設的實現:

    1) 對於EntityFrameworkCore,提供了EfCoreRepositoryBase<TDbContext, TEntity, TPrimaryKey>的泛型版本的實現方式。
    2) 對於NHibernate,提供了NhRepositoryBase<TEntity, TPrimaryKey>的泛型版本的實現方式。

      這些使用泛型的實現類,在大多數的時候,這些實現類中的方法已經足夠應付一般增刪改查的需要。如果預設實現類中的方法對於實體類來說已夠用了,我們便不需要再去建立這個實體所需的倉儲介面與實現類。直接通過在應用服務層定義倉儲引用,然後通過建構函式注入即可。

接下來,我們來講講如何自定義倉儲實現類。

二、如何實現自定義倉儲

1. 在Visual Studio 2017的“解決方案資源管理器”中,右鍵單擊在領域層“ABP.TPLMS.Core”專案。 選擇“新增” > “新建資料夾”。

2.將資料夾命名為“IRepositories”。

3. 右鍵單擊“IRepositories”資料夾,然後選擇“新增” > “類”。 在彈出對話方塊“新增新項- ABP.TPLMS.Core”中選擇介面,將介面命名為 IModuleRepository。然後使用滑鼠左鍵單擊“新增”按鈕。如下圖。

 

4. IModuleRepository介面的程式碼如下。

using Abp.Domain.Repositories;
using ABP.TPLMS.Entitys;
using System;
using System.Collections.Generic;
using System.Text; 

namespace ABP.TPLMS.IRepositories
{

    interface IModuleRepository: IRepository<Module>
    {
   
        /// <summary>
        /// 分頁查詢功能模組
        /// </summary>
        /// <param name="pageindex">頁索引</param>
        /// <param name="pagesize">每頁多少條</param>
        /// <returns>模組列表</returns>
        IEnumerable<Module> LoadModules(int pageindex, int pagesize);

        /// <summary>
        /// 批量刪除
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        bool Delete(string ids);
    }

}

 

三、在基礎架構層,實現該倉儲。

    1. 在Visual Studio 2017的“解決方案資源管理器”中,開啟“ABP.TPLMS.EntityFrameworkCore”專案,找到“Repositories”目錄,在這個目錄中有一個ABP生成的基類。如下圖。

 

    2. 滑鼠右鍵單擊“Repositories”資料夾,然後選擇“新增” > “類”。 在彈出對話方塊“新增新項- ABP.TPLMS.EntityFrameworkCore”中類命名為 IModuleRepository。然後使用滑鼠左鍵單擊“新增”按鈕。程式碼如下。

using Abp.EntityFrameworkCore;
using ABP.TPLMS.Entitys;
using ABP.TPLMS.IRepositories;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text; 

namespace ABP.TPLMS.EntityFrameworkCore.Repositories
{

   public class ModuleRepository:TPLMSRepositoryBase<Module>, IModuleRepository
    {

        public ModuleRepository(IDbContextProvider<TPLMSDbContext> dbContextProvider)
            : base(dbContextProvider)
        {
        } 

        public bool Delete(string ids)
        {
              var idList = ids.Split(',');
            Expression<Func<Module, bool>> exp = m => idList.Contains(m.Id.ToString());        

            bool result = true;      
                Delete(exp); 
            return result;

        }    

        public IEnumerable<Module> LoadModules(int pageindex, int pagesize)
        {
            return Context.Modules.OrderBy(u => u.Id).Skip((pageindex - 1) * pagesize).Take(pagesize);

        }
    }
}

      該倉儲實現,繼承自模板生成的TPLMSRepositoryBase泛型抽象類,然後再實現IModuleRepository介面。這裡要顯示宣告實現類的有參建構函式,使用泛型的IDbContextProvider將資料庫上下文的子類ChargeStationContext傳給父類的建構函式。如下圖。

 

四、倉儲的注意事項

  1. 倉儲實現類方法中,ABP自動進行資料庫連線的開啟和關閉。
  2. 倉儲方法被呼叫時,資料庫連線自動開啟事務。
  3. 當倉儲方法呼叫另外一個倉儲的方法,它們實際上共享的是同一個資料庫連線和事務。
  4. 倉儲物件都是暫時性的,因為IRepository介面預設繼承自ITransientDependency介面。所以,倉儲物件只有在需要注入的時候,才會由Ioc容器自動建立新例項。
  5. ABP預設的泛型倉儲功能滿足我們大部分的CURD操作需求。當有預設的倉儲功能不滿足需求的情況下,可以建立自己定製化的倉儲實現類。

相關文章