搜尋
首頁後端開發C#.Net教程ABP入門系列(4)-領域層定義倉儲並實現

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

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


ABP入門系列(4)-領域層定義倉儲並實現

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入門系列(4)-領域層定義倉儲並實現


三、倉儲的注意事項

倉儲方法中,ABP自動進行資料庫連線的開啟與關閉。

倉儲方法被呼叫時,資料庫連線會自動開啟且啟動事務。

當倉儲方法呼叫另一個倉儲的方法,它們實際上共享的是同一個資料庫連接和事務。

倉儲物件都是暫時性的,因為IRepository介面預設繼承自ITransientDependency介面。所以,倉儲物件只有在需要注入的時候,才會由Ioc容器自動建立新實例。

預設的泛型倉儲能滿足我們大部分的需求。只有在不滿足的情況下,才創建客製化的倉儲。

原始碼已上傳至Github-LearningMpaAbp,可自行參考。
ABP入門系列目錄-學習Abp框架之實操演練

以上就是ABP入門系列(4)-領域層定義倉儲並實現的內容,更多相關內容請關注PHP中文網(www.php.cn )!


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
現代世界中的C#.NET:應用和行業現代世界中的C#.NET:應用和行業May 08, 2025 am 12:08 AM

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

C#.NET開發人員社區:資源和支持C#.NET開發人員社區:資源和支持May 06, 2025 am 12:11 AM

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

C#.NET優勢:功能,好處和用例C#.NET優勢:功能,好處和用例May 05, 2025 am 12:01 AM

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

C#總是與.NET關聯嗎?探索替代方案C#總是與.NET關聯嗎?探索替代方案May 04, 2025 am 12:06 AM

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

.NET生態系統:C#的角色和超越.NET生態系統:C#的角色和超越May 03, 2025 am 12:04 AM

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

C#作為.NET語言:生態系統的基礎C#作為.NET語言:生態系統的基礎May 02, 2025 am 12:01 AM

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

c#vs. .net:澄清關鍵差異和相似之處c#vs. .net:澄清關鍵差異和相似之處May 01, 2025 am 12:12 AM

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

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

mPDF

mPDF

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

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SecLists

SecLists

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

SublimeText3 英文版

SublimeText3 英文版

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

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具