asp.net abp模塊化開發之通用樹2:設計思路及源碼解析

来源:https://www.cnblogs.com/jionsoft/archive/2019/12/25/12099048.html
-Advertisement-
Play Games

一、前言 上一篇大概說了下abp通用樹形模塊如何使用,本篇主要分析下設計思路。 日常開發中會用到很多樹狀結構的數據,比如:產品的多級分類、省市區縣,大多數系統也會用到類似“通用字典/數據字典”的功能,為系統各個地方提下拉框選擇的數據源。abp提供了一個模塊化系統,只要按它的約定就可以實現一個通用的樹 ...


一、前言

 

 

上一篇大概說了下abp通用樹形模塊如何使用,本篇主要分析下設計思路。

日常開發中會用到很多樹狀結構的數據,比如:產品的多級分類、省市區縣,大多數系統也會用到類似“通用字典/數據字典”的功能,為系統各個地方提下拉框選擇的數據源。abp提供了一個模塊化系統,只要按它的約定就可以實現一個通用的樹形數據的模塊,這樣公司的多個系統都可以使用,也可以用類似nuget的方式提供給別人使用。

先列舉下它的功能

  1. 通過nuget方便安裝和升級
  2. 配置簡單
  3. 預設已經提供“通用字典”功能
  4. 實體、管理器、應用服務都是抽象類,結合泛型 狠容易擴展實現自己的樹形結構

 

 

 

 

二、必備知識

這不是abp入門級的文章,是探討系統模塊化開發的一種思路。所以要求對abp有經驗,完整看過abp文檔,對涉及到的模塊、依賴註入、啟動配置、許可權、菜單、本地化等等概念有清晰的認識

 

三、包和源碼

源碼地址:https://github.com/bxjg1987/abpGeneralModules
nuget:Install-Package BXJG.GeneralTree -Version 1.0.2
線上地址:  http://test.cqsifang.com/    賬號密碼:admin  zlj.com    (別胡來,拜托...)
源碼倉庫中還有通用的文件模塊、附件模塊,後期會講講;nuget搜索bxjg可以找到這幾個相關的包

 

四、總體設計

為了便於說明,我們以常見的產品無限級分類來說明,所有樹形結構數據有這麼幾個特點:

  • 有個ParentId屬性指向父級節點,
  • 有個code,數據格式類似:00001.00001,一個是能簡單體現產品分類節點的層級結構,二個是方便將來查詢某個分類及其後代分類下的所有產品 where categoryCode like '00001%
  • 當然還有Name屬性

上面說了定義實體類的關鍵點,然後我們需要提供一個對應的Manager(這個是abp定義領域服務的套路),來主負責CRUD和節點間的移動操作,其實最麻煩的就是自動處理code,新增和修改時要根據所屬父節點的code自動生成子節點的code,移動時就更複雜了,要重新計算當前節點及其兄弟節點及其所有後代節點的code,這還涉及到目標節點和源節點。為了便於擴展,上面的領域服務還得將被處理的實體泛型話,文章後續會具體說明

最後按abp套路我們還需要提一個應用服務,它核心操作就是調用上面提供的Manager做節點的crud操作,在此基礎上按abp的套路應該提供許可權驗證、處理實體與dto之間的轉換。同理為了便於將來模塊的使用方進行擴展,我們應該應用抽象類和泛型的威力,文章後續會具體說明

最後我們如何提供Repository呢?參考abp zero的思路,我們將這個遺留到調用方來定義。在我們的領域服務Manager和應用服務AppService中都是通過依賴註入註入的IRepository<TEntity,TKey>

核心的3個東東定義好後,我們分別實現一個預設類,實現一個“通用字典”,將來調用方可以繼承我們的類並提供泛型參數來實現他們自己的樹形結構。
另外我們將所有的代碼放在一個項目中,因為模塊足夠小,功能少  這樣調用方用起來更方便

註意一點,上面以產品分類來說明只是便於理解,既然要提供擴展能力,設計時只能從抽象的角度來看待樹形數據,否則設計出來的東西很容易最後發現不夠抽象,此廢話只可意會不可言傳

最後是abp相關的:本地化定義、模塊定義及依賴關係、許可權提供器、菜單提供器、動態webapi的處理

五、實體類

實體類我這裡只是說明,具體源碼請訪問頂部的github

GeneralTreeEntity<TEntity>

它定義了樹形結構數據的通用樹形,Id、Code、Name、Parent等
泛型TEntity是子節點的類型,由於是樹,實際上也是父節點的類型,這種設計是方便將來模塊使用方在實現自定義的樹形結構時拿到的Parent樹形和Children樹形,是他們自己定義的類型
主鍵Id屬性,我定死了long類型,其實也可以使用泛型的TKey,思來想去簡單起見直接定死吧

public class GeneralTreeEntity : GeneralTreeEntity<GeneralTreeEntity>

為了提供我們預設實現的“通用字典”功能,我們定義一個預設的子類GeneralTreeEntity,將來系統中那些簡單的數據可以直接使用它
IsSysDefine表示此節點是否是系統預定義的,將來不允許刪除
IsTree是否是樹形,將來可能會用到,因為某些下拉框數據可能不需要多層次的,比如:民族,學歷

六、領域服務

按套路我們提供一個抽象的領域服務Manager類,和一個為了實現“通用字典”功能的預設實現

public abstract class GeneralTreeManager<TEntity> : DomainService  where TEntity : GeneralTreeEntity<TEntity>

它的主要職責總體設計也說了一嘴,完成crud和move移動操作,難點是處理code的自動生成,尤其是移動節點時,節點原來位置之後的其它節點及其後代節點、目標節點之後的其它節點及其後代節點的code的生成
內部對數據的操作直接註入IRepository<TEntity, long>,因此按abp的套路,預設情況下使用EF時,調用方只需要在他的DBContext中頂一個DBSet就可以了

public class GeneralTreeManager : GeneralTreeManager<GeneralTreeEntity>

實現“通用數據字典”的預設領域服類,因為核心功能父類基本都完成了。所以幾乎沒代碼

七、應用服務

按套路一個抽象類,一個預設實現類,內部核心操作是上面提供的Manager來完成的,應用服務主要是出去許可權和dto之間的轉換

public  class GeneralTreeAppServiceBase< TEntity,  TDto, TEditDto> : ApplicationService,     IGeneralTreeAppServiceBase<TDto, TEditDto>
        where TEntity : GeneralTreeEntity<TEntity>
        where TDto : GeneralTreeGetTreeNodeBaseDto<TDto>, new()
        where TEditDto : GeneralTreeNodeEditBaseDto

另外它提供了一些通用方法,一個樹形數據通常在3個地方唄使用,以產品分類為例,在產品分類的管理頁面、在產品的搜索欄應該提供產品類別的選擇、在產品編輯頁面應該有個下拉框選擇當前產品所屬類別,其它樹形數據都有類似的場景,因此抽象的應用服務處理了這部分功能

public class GeneralTreeAppService : GeneralTreeAppServiceBase< GeneralTreeEntity, GeneralTreeDto, GeneralTreeEditDt, GeneralTreeManager>,IGeneralTreeAppService

按套路我們為“通用字典”提供了一個預設的實現類

 

應用服務中的DTO定義、應用服務介面我這裡省略了,這是abp的常規套路,請看源碼

八、abp相關套路:模塊、本地化、許可權、菜單

模塊和本地化就不說了,abp的常規套路
由於我們提供了“通用字典”,預設情況下是可以直接用作你項目的,調用方完全可以按abp的套路在自己的模塊中來配置許可權和菜單,但是預設我們的模塊也提供了,調用方完全可以在主機的PermissionProvicer和NavigationProvider的合適的位置配置許可權和菜單。參考GeneralTreeModuleConfig源碼

九、總結

abp本身提供了模塊化方式,如果運用得當我們的系統可以由很多小模塊組成,將來更容易維護、升級和復用
就好比我們目前提供的通用樹,如果你使用的是abp,那麼完全可以拿去就用,類似的“通用附件”模塊,因為我們的多個系統或者同一個系統都可能會用到附件的功能,到處複製代碼是下下策。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • springboot集成開發實現商場秒殺 加入主要依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependen ...
  • "題目鏈接" problem 給出一個$n,n include include include include include include include include using namespace std; typedef long long ll; const int N = 50001 ...
  • 場景 Dubbo環境搭建-管理控制台dubbo-admin實現服務監控: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103624846 Dubbo搭建HelloWorld-搭建服務提供者與服務消費者並完成遠程調用(附代碼下載) ...
  • 這篇文章介紹的內容是關於PHP+Mysql防止SQL註入的方法,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下 方法一: mysql_real_escape_string -- 轉義 SQL 語句中使用的字元串中的特殊字元,並考慮到連接的當前字元集 ! $sql = "select c ...
  • 本篇文章給大家分享的內容是關於如何通過Docker搭建一個swoft開發環境 ,內容很詳細,有需要的朋友可以參考一下,希望可以幫助到你們。Swoft首個基於 Swoole 原生協程的新時代 PHP 高性能協程全棧組件化框架,內置協程網路伺服器及常用的協程客戶端,常駐記憶體,不依賴傳統的 PHP-FPM ...
  • 在項目中經常用到枚舉作為數據字典值和描述的相互轉化。 用法如下: 當枚舉類多了之後,會存在很多重覆的值和描述相互轉化的方法,類似getEnmuByValue和getEnmuByKey。 最近找到一種方法,利用介面、介面預設方法、泛型,實現通用的方法。同類型的枚舉只需要實現該介面即可。 代碼如下: 具 ...
  • 最近項目涉及到一個定時任務的功能,所以去這幾天研究了一下 crontab 的使用方法,按照網上的相關教程順利在自己的電腦上成功開啟了這個功能 Laravel + crontab 添加 crontab 配置 1、執行命令 $ crontab -e 2、添加以下內容( path/to為應用路徑 ),即每 ...
  • 本筆記摘抄自:https://www.cnblogs.com/liqingwen/p/5801249.html,記錄一下學習過程以備後續查用。 “標準查詢運算符”是組成語言集成查詢 (LINQ) 模式的方法,大多數這些方法都在序列上運行,其中的序列是一個對象,其類型實現了IEnumerable<T> ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...