大話領域驅動設計——基礎設施層

概述

d7a0bd41e4e2c567a6196e41f120a518.png

基礎設施層是整個系統的?持層,通過對第三?類庫的調?或系統的抽象和集成來實現對其他層的?持。

690ebcf97edcebb88216bbc105475929.png

與傳統架構不同在DDD中,數據庫訪問的具體實現(倉儲)也被放在了基礎設施層。

addb1408d7fa592f725fffef400e7d8c.png

在DDD的理念中,基礎設施層是為領域和用例的邏輯實現提供支撐。在前面的章節我也提到,在DDD的理念中,數據訪問具體實現不是設計過程需要關注的重點,所以將具體訪問數據庫的代碼放在了基礎設施層。

概覽

3ce69d18877f27f1b85e9f4b7c65db70.gif

通常情況下,我們會將提供數據服務連接的相關類和方法存放于一個項目中,而將其他公共類,公共方法存放于另外的一個或多個項目中。這些自定義的公共類庫,這里我就不具體講述,請依據個人項目需要來進行規劃設計。

5c1f55c7a590af4f6239e3bcf2ed4981.gif

基礎設施層數據庫連接服務主要包含以下組件:

倉儲(Repository)實現:對領域層定義的倉儲接口的實現類,用戶封裝對領域對象的數據持久化操作的具體實現。

0a0b30c042b59b72544ddbf3ff7e18e9.gif

在ABP框架下,基礎設施層提供數據庫訪問的類庫包含應用程序的數據庫上下文(DbContext)、數據庫映射、倉儲的實現等信息。依據項目需要,我們可以通過CLI中的?-d?參數來選擇使用EF Core或者MongoDB,分別會包含以下兩個類庫:

EntityFrameworkCore:是EF Core的基本集成包,支持SQL Server、MySQL、SQLite、Oracle、PostgreSQL數據庫。默認使用SQL Server數據庫。

MongoDB:以MongoDB為數據庫的基礎設施層類庫。

實現細節

1

默認倉儲

d5d8a8f5fb95041e012e980230c9dcf4.gif

ABP提供了用于實體增刪改查的默認倉儲接口和實現類,在大多數情況下,我們只需要直接注入使用默認倉儲?IRepository<TEntity, TKey>?即可,其中TEntity為需要操作的實體,TKey為該實體主鍵的數據類型。

73217be8dc4eb23aa480497a376e14c8.gif

使用默認倉儲時,需要在EntityFrameworkCore項目的Module類中的?ConfigureServices?方法中加入以下代碼用于給所有實體創建默認倉儲:

context.Services.AddAbpDbContext<MyDbContext>(options =>{options.AddDefaultRepositories(includeAllEntities: true);});

468f1555332b989b80f020e2c11e6c09.png

其中MyDbContext為當前項目的數據上下文,includeAllEntities參數為true時會給所有實體、聚合根創建默認倉儲,如果為false則只給聚合根創建默認倉儲。

d43773ecefcdbdfd59ace8068357d5f9.gif

在默認倉儲中,ABP提供了以下方法可供直接操作數據庫:

  • GetAsync:通過lambda 表達式查詢單個實體,如果存在多個滿足條件的實體,則拋出?InvalidOperationException?異常。

  • FindAsync:通過lambda 表達式查詢單個實體,如果存在多個滿足條件的實體,則拋出?InvalidOperationException?異常。

  • InsertAsync:添加實體。

  • InsertManyAsync:批量添加。

  • UpdateAsync:更新實體。

  • UpdateManyAsync:批量修改。

  • DeleteAsync:刪除實體,也可根據Lambda表達式刪除。

  • DeleteManyAsync:批量刪除。

  • GetListAsync:獲取數據庫中所有實體的列表。

  • GetPagedListAsync:分頁獲取實體集合。

  • GetCountAsync:獲取數據庫中所有實體的計數。

55f398abe40968c7ca38096b03bfc119.png

GetAsync方法和FindAsync方法的區別為:如果實體未找到,GetAsync拋出?EntityNotFoundException?異常,而FindAsync方法返回?null?

3afa6ea9228e6d54ab9634a83a935c2a.gif

另外,在很多情況下,我們希望獲取?IQueryable?類型用于自定義Linq查詢,在ABP 5.0版本之后,獲取IQueryable方式改為?await?_personRepository.GetQueryableAsync();?

2

自定義倉儲

b84d4d15f24c12f29d89394ccddf582b.gif

如果默認倉儲不能滿足我們的需求,我們可以自定義倉儲接口和實現。

b5db7b9c0d4003b040e533b75dc1c37e.gif

自定義倉儲接口聲明存放與領域層,可繼承自?IRepository<TEntity,TKey>?,其實現類存放與基礎設施層,繼承自?EfCoreRepository<TDbContext,TEntity,TKey>?或?MongoDbRepository<TDbContext, TEntity, TKey>?

3

Dapper集成

9d1db77f0e7838f8c1aadaf8d33f2c6c.gif

在一些情況下,我們希望可以使用自定義的SQL語句進行更靈活的數據庫操作或者執行存儲過程調用等操作,而Dapper框架可以滿足我們需求。

7e39b6a52466d78b7f1b83fe120f7d1c.gif

在ABP,Dapper框架并被沒有完整的集成,而是依托于EF Core實現。也就意味著如果要使用Dapper,創建項目時,數據訪問對象依舊選擇EF Core。

20c559debcb801eb92bd548000d97aea.gif

當使用Dapper時,我們需要創建自定義倉儲,并將其實現類繼承自?DapperRepository<TDbContext>?,其中TDbContext為EF Core項目的數據上下文。

9da425ce813aff226984e6ae2024784c.gif

具體用法,我們可以參考官方提供的示例:

public class PersonDapperRepository : DapperRepository<MyAppDbContext>, ITransientDependency
{public PersonDapperRepository(IDbContextProvider<MyAppDbContext> dbContextProvider): base(dbContextProvider){}public virtual async Task<List<string>> GetAllPersonNames(){var dbConnection = await GetDbConnectionAsync();return (await dbConnection.QueryAsync<string>("select Name from People", transaction:  await GetDbTransactionAsync())).ToList();}public virtual async Task<int> UpdatePersonNames(string name){var dbConnection = await GetDbConnectionAsync();return await dbConnection.ExecuteAsync("update People set Name = @NewName", new { NewName = name },await GetDbTransactionAsync());}
}

1d86a196f6d5585c3e0f9cce1f151377.png

58f217e2954939965fed4c975001f464.png

8100e0a7191cdd521c31180278b9f85e.png

歡迎加入微信交流群

END

869ed674d771c73650292777ed6eb4d4.png

044be15086f0dd6cd8c8b511f84d70f8.png

關注我獲得

更多精彩

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286139.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286139.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286139.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言試題四十四之移動一維數組中的內容,若數組中由n個整數,要求把下標從0到p(p小于等于n-1)的數組元素平移到數組的最后。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫一個…

【MATLAB統計分析與應用100例】案例004:matlab調用smoothts函數對金融時間序列數據進行平滑處理

時間序列數據進行平滑處理效果預覽: Excel原數據部分預覽: 1. 讀取金融時間序列數據,繪制波形圖 x = xlsread(examp03_02.xls); % 從文件examp03_02.xls中讀取數據 price = x(:,4)

javaweb優化

http://blog.csdn.net/jiangzhaobao/article/details/8003244轉載于:https://www.cnblogs.com/yzjT-mac/p/5889292.html

MultiProcess-MultiThread

聽到一些關于python多進程與多線的例子&#xff0c;感覺比較經典&#xff0c;把一些例子分享一下. 內容如下&#xff1a; Process、Thread、GIL、Process fork、Multiprocessing、Queue、ProcessPool、Multiprocess-Multithread comparison (1) Process : 程序的一次執行(程序編…

【MATLAB統計分析與應用100例】案例005:matlab調用medfilt1函數對加噪正弦波信號進行平滑處理

平滑效果預覽: 文章目錄 1. 產生加噪正弦波信號,繪制加噪波形圖2. 調用medfilt1對加噪正弦波信號y進行中值濾波,并繪制波形圖1. 產生加噪正弦波信號,繪制加噪波形圖 t = linspace(0,2*pi,500); % 產生一個從0到2

十、為影院添加影片及座位安排《仿淘票票系統前后端完全制作(除支付外)》

一、選中添加功能完成 首先打開在線編輯器進入我們的項目&#xff1a;https://editor.ivx.cn/ 在上一節咱們已經完成了對應的準備工作&#xff0c;在這一節中&#xff0c;咱們只需要對其進行調用即可&#xff0c;調用前還需要處理這些數據&#xff1a; 首先選中時&#xff0…

遍歷文件夾還原數據庫SQL語句

/***** 遍歷文件夾進行數據庫還原 *******/---需要開啟xp_cmdshell 如已經開啟 可以略過 /***** Step 1 開啟 xp_cmdshell Use Master GO EXEC master.dbo.sp_configure show advanced options, 1 RECONFIGURE WITH OVERRIDE GO EXEC master.dbo.sp_configure xp_cmdshell, 1…

聊聊 C# 和 C++ 中的 泛型模板 底層玩法

最近在看 C 的方法和類模板&#xff0c;我就在想 C# 中也是有這個概念的&#xff0c;不過叫法不一樣&#xff0c;人家叫模板&#xff0c;我們叫泛型&#xff0c;哈哈&#xff0c;有點意思&#xff0c;這一篇我們來聊聊它們底層是怎么玩的&#xff1f;一&#xff1a;C 中的模板玩…

ceph集群報 Monitor clock skew detected 錯誤問題排查,解決

ceph集群報 Monitor clock skew detected 錯誤問題排查&#xff0c;解決 告警信息如下&#xff1a; [rootceph-100-80 ceph]# ceph -w cluster ddc1b10b-6d1a-4ef9-8a01-d561512f3c1d health HEALTH_WARN clock skew detected on mon.ceph-100-81,…

Java實現畫八卦

八卦是由多個圓疊加而成&#xff0c;如果我們讓每個圓都有自己的顏色&#xff0c;那么具體結構便一目了然&#xff0c;如下圖所示&#xff1a; 顯然只要令對應的圓顏色相同&#xff0c;就能達到我們預期的效果。 用Java就能輕松畫出來&#xff1a; import java.awt.BasicStroke…

C語言試題四十五之把第1到第p個字符,平移到字符串的最后,把第p+1到最后的字符移到字符串的前部。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫一個…

【MATLAB統計分析與應用100例】案例006:matlab數據的標準化變換

文章目錄 1. 調用rand函數產生一個10行,4列的隨機矩陣,每列服從不同的均勻分布2. 調用zscore函數對x進行標準化變換(按列標準化),返回變換后矩陣xz,以及矩陣x各列的均值構成的向量mu,各列的標準差構成的向量sigma3. 變換結果1. 調用rand函數產生一個10行,4列的隨機矩陣…

十一、為影院添加影片制作準備服務《仿淘票票系統前后端完全制作(除支付外)》

一、為影院添加影片的邏輯和思考 首先打開在線編輯器進入我們的項目&#xff1a;https://editor.ivx.cn/ 進入之后找到上一節中制作的頁面&#xff0c;咱們設置點擊編輯按鈕后進入的頁面為影院添加影片頁&#xff1a; 接著咱們查看影院添加影片頁&#xff1a; 在該頁中&…

Linux 內核中斷內幕【轉】

轉自:http://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint/ 本文對中斷系統進行了全面的分析與探討&#xff0c;主要包括中斷控制器、中斷分類、中斷親和力、中斷線程化與 SMP 中的中斷遷徙等。首先對中斷工作原理進行了簡要分析&#xff0c;接著詳細探討了中斷親…

SQL Server表分區

SQL Server表分區 什么是表分區 一般情況下&#xff0c;我們建立數據庫表時&#xff0c;表數據都存放在一個文件里。 但是如果是分區表的話&#xff0c;表數據就會按照你指定的規則分放到不同的文件里&#xff0c;把一個大的數據文件拆分為多個小文件&#xff0c;還可以把這…

apt 根據注解,編譯時生成代碼

apt&#xff1a; Retention后面的值&#xff0c;設置的為CLASS&#xff0c;說明就是編譯時動態處理的。一般這類注解會在編譯的時候&#xff0c;根據注解標識&#xff0c;動態生成一些類或者生成一些xml都可以&#xff0c;在運行時期&#xff0c;這類注解是沒有的~~會依靠動態生…

Web.config配置文件詳解(新手必看)

花了點時間整理了一下ASP.NET Web.config配置文件的基本使用方法。很適合新手參看&#xff0c;由于Web.config在使用很靈活&#xff0c;可以自定義一些節點。所以這里只介紹一些比較常用的節點。 <?xml version"1.0"?> <!--注意: 除了手動編輯此文件以外&…

Hello Playwright:(6)與元素交互

在上一節我們已經了解到如何定位到元素&#xff0c;那么接下來就可以與元素進行交互了。下面的例子都是以百度首頁作為測試頁面輸入文本FillAsync方法用于模擬用戶選中元素并輸入文本&#xff0c;這會觸發元素的 input 事件。該方法只適合<input>、<textarea>等可輸…

C語言試題四十六之將m行n列的二維數組中的字符數據,按列的順序依次放到一個字符串中。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫一個…

【MATLAB統計分析與應用100例】案例007:matlab數據的極差歸一化變換

文章目錄 1. 調用rand函數產生一個10行,4列的隨機矩陣,每列服從不同的均勻分布2. 調用rscore函數對x按列進行極差規格化變換, 返回變換后矩陣R,以及矩陣x各列的最小值構成的向量xmin,各列的極差構成的向量xrange1. 調用rand函數產生一個10行,4列的隨機矩陣,每列服從不同…