倉儲(Repository): 倉儲用來操作資料庫進行資料存取。倉儲介面在領域層定義,而倉儲的實作類別應該寫在基礎設施層。
在ABP中,倉儲類別要實現IRepository接口,接口定義了常用的增刪改查以及聚合方法,其中包括同步及異步方法。主要包括以下方法:
ABP針對不同的ORM框架對該介面給予了預設的實作;
針對EntityFramework,提供了EfRepositoryBase
針對NHibernate,提供了NhRepositoryBase
泛型版本的實作就意味著,大多數的時候,這些方法已足已應付一般實體的需要。如果這些方法對實體來說已經足夠,我們便不需要再去建立這個實體所需的倉儲介面/類別。
直接透過在應用服務層定義倉儲引用,然後透過建構函式註入即可。在我們的應用程式服務層即可以以下方式使用Task倉儲:
public class TaskAppService : ITaskAppService { private readonly IRepository<Task> _taskRepository; public TaskAppService(IRepository<Task> taskRepository) { _taskRepository = taskRepository; }
範例程式碼中使用的就是這種方式
二、如何實作自訂倉儲
假設我們需要尋找某個使用者都指派哪些任務。
在領域層,建立IRepositories資料夾,然後定義IBackendTaskRepository。
namespace LearningMpaAbp.IRepositories {/// <summary>/// 自定义仓储示例/// </summary>public interface IBackendTaskRepository : IRepository<Task> { /// <summary> /// 获取某个用户分配了哪些任务 /// </summary> /// <param name="personId">用户Id</param> /// <returns>任务列表</returns> List<Task> GetTaskByAssignedPersonId(long personId); } }
在基礎架構層,實現該倉儲。
namespace LearningMpaAbp.EntityFramework.Repositories {public class BackendTaskRepository:LearningMpaAbpRepositoryBase<Task>,IBackendTaskRepository{ public BackendTaskRepository(IDbContextProvider<LearningMpaAbpDbContext> dbContextProvider) : base(dbContextProvider) { } /// <summary> /// 获取某个用户分配了哪些任务 /// </summary> /// <param name="personId">用户Id</param> /// <returns>任务列表</returns> public List<Task> GetTaskByAssignedPersonId(long personId) { var query = GetAll(); if (personId>0) { query = query.Where(t => t.AssignedPersonId == personId); } return query.ToList(); } } }
此倉儲實現,繼承自模板產生的LearningMpaAbpRepositoryBase泛型抽象類,然後再實作IBackendTaskRepository介面。這裡要顯示宣告實作類別的有參建構函數,使用泛型的IDbContextProvider將資料庫上下文的子類別ChargeStationContext傳給父類別的建構子。
三、倉儲的注意事項
倉儲方法中,ABP自動進行資料庫連線的開啟與關閉。
倉儲方法被呼叫時,資料庫連線會自動開啟且啟動事務。
當倉儲方法呼叫另一個倉儲的方法,它們實際上共享的是同一個資料庫連接和事務。
倉儲物件都是暫時性的,因為IRepository介面預設繼承自ITransientDependency介面。所以,倉儲物件只有在需要注入的時候,才會由Ioc容器自動建立新實例。
預設的泛型倉儲能滿足我們大部分的需求。只有在不滿足的情況下,才創建客製化的倉儲。
原始碼已上傳至Github-LearningMpaAbp,可自行參考。
ABP入門系列目錄-學習Abp框架之實操演練
以上就是ABP入門系列(4)-領域層定義倉儲並實現的內容,更多相關內容請關注PHP中文網(www.php.cn )!

C#.NET在現代世界中廣泛應用於遊戲開發、金融服務、物聯網和雲計算等領域。 1)在遊戲開發中,通過Unity引擎使用C#進行編程。 2)金融服務領域,C#.NET用於開發高性能的交易系統和數據分析工具。 3)物聯網和雲計算方面,C#.NET通過Azure服務提供支持,開發設備控制邏輯和數據處理。

C#.NET開發者社區提供了豐富的資源和支持,包括:1.微軟的官方文檔,2.社區論壇如StackOverflow和Reddit,3.GitHub上的開源項目,這些資源幫助開發者從基礎學習到高級應用,提升編程技能。

C#.NET的優勢包括:1)語言特性,如異步編程簡化了開發;2)性能與可靠性,通過JIT編譯和垃圾回收機制提升效率;3)跨平台支持,.NETCore擴展了應用場景;4)實際應用廣泛,從Web到桌面和遊戲開發都有出色表現。

C#並不總是與.NET捆綁在一起。 1)C#可以在Mono運行時環境中運行,適用於Linux和macOS。 2)在Unity遊戲引擎中,C#用於腳本編寫,不依賴.NET框架。 3)C#還可用於嵌入式系統開發,如.NETMicroFramework。

C#在.NET生態系統中扮演核心角色,是開發者的首選語言。 1)C#提供高效、易用的編程方式,結合C、C 和Java的優點。 2)通過.NET運行時(CLR)執行,確保跨平台高效運行。 3)C#支持從基本到高級的用法,如LINQ和異步編程。 4)優化和最佳實踐包括使用StringBuilder和異步編程,提高性能和可維護性。

C#是微軟在2000年發布的編程語言,旨在結合C 的強大功能和Java的簡潔性。 1.C#是一種類型安全、面向對象的編程語言,支持封裝、繼承和多態。 2.C#的編譯過程將代碼轉化為中間語言(IL),然後在.NET運行時環境(CLR)中即時編譯成機器碼執行。 3.C#的基本用法包括變量聲明、控制流和函數定義,而高級用法涵蓋異步編程、LINQ和委託等。 4.常見錯誤包括類型不匹配和空引用異常,可通過調試器、異常處理和日誌記錄來調試。 5.性能優化建議包括使用LINQ、異步編程和提高代碼可讀性。

C#是一種編程語言,而.NET是一個軟件框架。 1.C#由微軟開發,適用於多平台開發。 2..NET提供類庫和運行時環境,支持多語言。兩者協同工作,構建現代應用。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具