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”中類命名為 ModuleRepository。然后使用鼠標左鍵單擊“添加”按鈕。代碼如下。
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傳給父類的構造函數。如下圖。
四、倉儲的注意事項
- 倉儲實現類方法中,ABP自動進行數據庫連接的開啟和關閉。
- 倉儲方法被調用時,數據庫連接自動開啟事務。
- 當倉儲方法調用另外一個倉儲的方法,它們實際上共享的是同一個數據庫連接和事務。
- 倉儲對象都是暫時性的,因為IRepository接口默認繼承自ITransientDependency接口。所以,倉儲對象只有在需要注入的時候,才會由Ioc容器自動創建新實例。
- ABP默認的泛型倉儲功能滿足我們大部分的CURD操作需求。當有默認的倉儲功能不滿足需求的情況下,可以創建自己定制化的倉儲實現類。