MVC基礎——市場管理系統(三)Clean Architecture


文章目錄

  • 項目地址
  • 五、Clean Architecture
    • 5.1 user cage driven
      • 5.1.1創建CoreBusiness
    • 5.2 創建UseCases
      • 5.2.1 創建CategoriesUseCases
        • 1. 創建`VeiwCategoriesUseCase`獲取所有Cagegory
      • 5.2.2. 實現ICategoryRepository接口
        • 3. 實現獲取所有Category的方法
        • 4. 實現獲取一個Cagegory的方法
        • 5. 實現編輯Category的方法
        • 6. 實現獲取刪除Category的方法
      • 5.2.3 創建ProductsUseCases
        • 1. 創建一個AddProductUseCase
        • 2. 使用快捷鍵生成IProductRepository接口
        • 3. 通過快捷鍵生成接口對應的AddProduct方法
        • 4. 通過同樣的方式,將剩下的幾個UseCase完成
        • 5. 通過快捷鍵將UseCase 提取成為接口
          • 6. Product的內存Plugin的完善
    • 5.3 創建Plugins
      • 5.3.1 實現一個內存存儲的plugin
    • 5.4 在Controllers里使用IOC
      • 5.4.1 將項目所用到的所有服務,注冊到容器中
      • 5.4.2 添加程序集的引用給UI層
      • 5.4.3 從依賴注入容器里獲取需要的服務
      • 5.4.4 修改之前代碼通過使用接口的方法
        • 1. 在Validataion的服務里直接實例化IProductsRepository
        • 2. 創建一個ISellProductUseCase
    • 5.5 所有容器注冊完畢,結構展示
      • 5.5.1 Plugins/CoreBusiness
      • 5.5.2 UseCases類庫
        • 1. UseCases里的各個組成
        • 2. 每個Usecase里的方法和DataStorePluginInterface的關系


項目地址

  • 教程作者:
  • 教程地址:
  • 代碼倉庫地址:
  • 所用到的框架和插件:
dbt 
airflow

五、Clean Architecture

  1. usecase driven
  2. plugin based

5.1 user cage driven

5.1.1創建CoreBusiness

業務實體存放的類

  1. 創建一個class library,CoreBusiness
  2. Models文件夾下的Categories.csProducts.cs以及Transactions.cs三個實體類,移動到CoreBusiness類庫里,并修改他們的namespace

5.2 創建UseCases

  • 創建UseCases類庫

5.2.1 創建CategoriesUseCases

  • 從功能出發,如果我們需要一個處理Categories相關的業務,需要對Categories數據表有哪些操作
  1. 查詢出所有的Categories, ViewCategoriesUseCase.cs
  2. 查詢單個Category的信息,ViewSelectedCategoryUseCase.cs
  3. 添加單個Category,AddCategoryUseCase.cs
  4. 編輯單個Category,EditCategoryUseCase.cs
  5. 刪除單個Category,DeleteCategoryUseCase.cs
1. 創建VeiwCategoriesUseCase獲取所有Cagegory
  1. 在UseCases類庫里,創建文件夾CategoriesUseCases文件夾
  2. 在該文件夾下添加ViewCategoriesUseCase.cs
  3. ViewCategoriesUseCase.cs 只有一個公共的方法對外使用,因為他的功能顯示Category的列表
  4. 添加對CoreBusiness的引用
  5. 創建一個返回所有Category的方法Excute()
public IEnumerable<Category> Excute()
{
}
  1. 使用構造方法,注入一個ICategoryRepository,這里這個接口還沒有實現,只是我們知道我們需要用到這個接口提供的方法來獲取我們想要的數據,這就是usecase driven的核心
namespace UseCases.CategoriesUseCases
{public class ViewCategoriesUseCase{private readonly ICategoryRepository _categoryRepository;public ViewCategoriesUseCase(ICategoryRepository categoryRepository){this._categoryRepository = categoryRepository;}public IEnumerable<Category> Excute(){//需要用到這個接口給我們提供的GetCategories方法獲取數據return _categoryRepository.GetCategories();}}
}
  1. 至此,就完成了一個簡單的Use Case Driven,在UseCases層,我們關心,接口哪里來,在哪里實現,只關心我需要這個接口以及接口能解決問題的方法,只是接口的使用者;

5.2.2. 實現ICategoryRepository接口

定義了與 Category 實體相關的操作,所有關于Category的操作都在這個接口上,供給plugins使用

在這里插入圖片描述

1 . 在UseCases里創建文件夾DataStorePluginInterfaces
2. 創建ICategoryRepository.cs

using CoreBusiness;namespace UseCases.DataStorePluginInterfaces
{public interface ICategoryRepository{}
}
  1. 然后通過CategoriesUseCases里創建的方法,來逆向實現接口

在這里插入圖片描述

3. 實現獲取所有Category的方法
  • ViewCategoriesUseCase.cs里實現GetCategories()方法,該類只負責獲取所有的Category列表,單一職責
using CoreBusiness;
using UseCases.DataStorePluginInterfaces;namespace UseCases.CategoriesUseCases
{public class ViewCategoriesUseCase{private readonly ICategoryRepository _categoryRepository;public ViewCategoriesUseCase(ICategoryRepository categoryRepository){this._categoryRepository = categoryRepository;}public IEnumerable<Category> Excute(){return _categoryRepository.GetCategories();}}
}
4. 實現獲取一個Cagegory的方法
  • 創建ViewSelectedCategoryUseCase.cs,該類只負責獲取一個Cagegory

namespace UseCases.CategoriesUseCases
{public class ViewSelectedCategoryUseCase{private readonly ICategoryRepository _categoryRepository;public ViewSelectedCategoryUseCase(ICategoryRepository categoryRepository){this._categoryRepository = categoryRepository;}public Category Excute(int categoryId){return _categoryRepository.GetCategoryById(categoryId);}}
}
5. 實現編輯Category的方法
  • 創建EditCategoryUseCase.cs,該類只負責傳遞一個categoryId和cateogry類,編輯Category
namespace UseCases.CategoriesUseCases
{public class EditCategoryUseCase{private readonly ICategoryRepository _categoryRepository;public EditCategoryUseCase(ICategoryRepository categoryRepository){this._categoryRepository = categoryRepository;}public void Excute(int categoryId,Category catogory){_categoryRepository.UpdateCategory(categoryId, catogory);}}
}
6. 實現獲取刪除Category的方法
  • 創建EditCategoryUseCase.cs,該類只負責通過id刪除category
namespace UseCases.CategoriesUseCases
{public class DeleteCategoryUseCase{private readonly ICategoryRepository _categoryRepository;public DeleteCategoryUseCase(ICategoryRepository categoryRepository){this._categoryRepository = categoryRepository;}public void Excute(int categoryId){_categoryRepository.DeleteCategoryById(categoryId);}}
}

5.2.3 創建ProductsUseCases

所有的UseCases只有一個公共的方法Excute()的好處:

  1. 單一職責,只要是usecase就只有Excute的方法
  2. 統一入口點都是Excute(),這樣以后使用泛型或者反射都易于調用
  • 從功能出發,如果我們需要一個處理products相關的業務,需要對products數據表有哪些操作
  1. 查詢出所有的products, ViewProductsUseCase.cs
  2. 查詢單個product的信息,ViewSelectedProductUseCase.cs
  3. 添加單個product,AddProductUseCase.cs
  4. 編輯單個product,EditProductUseCase.cs
  5. 刪除單個product,DeleteProductUseCase.cs
  • 可以看出來以上都是基礎的增刪改查,和CategoriesUseCases 基本一樣,下面是products自己獨有的方法
1. 創建一個AddProductUseCase
  • 這里,我們先不用考慮程序里有什么接口,有什么功能,我們只需要寫
    1. 創建一個Excute函數,在所有的UseCase的公共出口
    2. 函數里面里根據功能,這里是添加一個Products,所以直接調用 _productRepository.AddProduct(product);
    3. 通過構造函數從容器中拿我需要repository

在這里插入圖片描述

2. 使用快捷鍵生成IProductRepository接口
  • 使用快捷鍵 生成接口,將會自動在原目錄下生成一個IProductRepository.cs的文件
    在這里插入圖片描述
  • IProductRepository.cs
namespace UseCases.ProductsUseCases
{public interface IProductRepository{}
}
  • 將自動該文件移動到DataStorePluginInterfaces文件夾下
3. 通過快捷鍵生成接口對應的AddProduct方法
  • 繼續使用快捷鍵,往接口里添加AddProduct方法
    在這里插入圖片描述
  • 此時,在IProductRepository接口里,我們的方法已經添加成功
using CoreBusiness;namespace UseCases.ProductsUseCases
{public interface IProductRepository{void AddProduct(Product product);}
}
4. 通過同樣的方式,將剩下的幾個UseCase完成
5. 通過快捷鍵將UseCase 提取成為接口

不要直接使用具體實現,而是通過接口使用UseCase

  • 使用快捷件, 將所有的UseCases提成接口

在這里插入圖片描述

  • 會在同級目錄下生成一個IAddProductUseCase.cs文件
using CoreBusiness;namespace UseCases.ProductsUseCases
{public interface IAddProductUseCase{void Execute(Product product);}
}
  • 并且自動,添加了該接口
    在這里插入圖片描述
  • 創建interfaces文件夾,在UseCases類庫內,將所有關于具體UseCases的用例接口放入

在這里插入圖片描述

6. Product的內存Plugin的完善

在這里插入圖片描述

  • 需要注意的是: Product商品的一些操作,需要和Category類進行交互,這和Category的plugin的區別;

在這里插入圖片描述

5.3 創建Plugins

Plugins就是真正實現ICategoryRepository的地方

5.3.1 實現一個內存存儲的plugin

  • 實現內存存儲

1.在項目的根目錄下創建一個Plugins文件夾,除了在vs里創建,還需要到項目的Folder里創建,因為vs創建的文件夾只是一個視圖文件夾,真正的文件夾要在folder里創建

在這里插入圖片描述
2. 創建一個Plugins.DateStore.InMemory類庫,并在類庫里創建CategoriesInMemoryRepository.cs,該類庫實現了ICategoryRepository的所有功能

 public class CategoriesInMemoryRepository : ICategoryRepository
  1. 將之前我們使用的內存存儲和查詢的方法,放到該類庫內
    在這里插入圖片描述
  2. 由于方法的名稱一樣,這里直接使用即可
    在這里插入圖片描述

5.4 在Controllers里使用IOC

  • 此時,就體現出了,創建具體UseCases的實例接口的好處,我們通過依賴注入是通過接口實例化,而不是直接通過實例,結耦

5.4.1 將項目所用到的所有服務,注冊到容器中

  • 在程序入口,將服務注冊進來

在這里插入圖片描述

5.4.2 添加程序集的引用給UI層

  • 因為UI層,是表現層,所以他需要將所有相關的類庫,都引入進來

在這里插入圖片描述

5.4.3 從依賴注入容器里獲取需要的服務

  1. 通過構造函數從容器里,直接獲取需要的服務
  2. 直接通過注冊服務的名字,就可以知道服務的功能,并且執行統一的Excute()方法
    在這里插入圖片描述

5.4.4 修改之前代碼通過使用接口的方法

1. 在Validataion的服務里直接實例化IProductsRepository
  • 由于中間件的生命周期不一樣, 在這里我們直接使用接口在Validation的context里直接獲取

在這里插入圖片描述

2. 創建一個ISellProductUseCase
  • 沒創建之前,進行數據的操作直接在Controller里,這是不應該發生的,現在創建了該接口之后,只需要傳遞相應的數據即可

在這里插入圖片描述

5.5 所有容器注冊完畢,結構展示

5.5.1 Plugins/CoreBusiness

  • Plugin里是UseCases/DataStorePluginInterfaces里接口的實現,這里對接的各個數據庫
  • CoreBuniess里只存放實例類,真實的數據庫的實體

在這里插入圖片描述

5.5.2 UseCases類庫

1. UseCases里的各個組成
  1. interfaces里所有接口都是各個usecase提取出的,作用就是用于注冊IOC服務,可以在controller里用;
  2. DataStorePluginInterfaces,各個數據庫需要繼承的庫
    在這里插入圖片描述
2. 每個Usecase里的方法和DataStorePluginInterface的關系

真正實現usecase的方法實際上是AddCategory方法,該方法是提取到ICategoryRepository里的實際方法

在這里插入圖片描述

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

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

相關文章

手機上和電腦上都能觀看的翻頁電子書是如何制作的?

想知道手機上和電腦上都能觀看的翻頁電子書是都是如何制作的&#xff1f; 想知道這樣的電子書是怎樣呈現出來的&#xff1f; 那收藏這篇文章&#xff0c;我來跟大家說說該如何實現。 操作方法 一、登錄FLBOOK 二、開始制作&#xff0c;有多種創建方式&#xff0c;分別是&…

ABAP時間戳與日期時間轉換及時區處理

一、時間戳轉換為日期時間 1. 基本轉換 CONVERT TIME STAMP <fs_back>-lastchangedatetime TIME ZONE sy-zonloINTO DATE DATA(lv_date)TIME DATA(lv_time).2. 解決8小時時差問題的方案 方案1&#xff1a;直接使用UTC時區&#xff08;推薦&#xff09; CONVERT TIME …

Java 實現給pdf文件指定位置蓋章功能

Java 實現給pdf文件指定位置蓋章功能 開發中遇到一個需求, 需要給用戶上傳的的pdf文件, 指定位置上蓋公章的功能, 經過調研和對比, 最終確定實現思路. 這里是使用pdf文件中的關鍵字進行章子的定位, 之所以這樣考慮是因為如果直接寫死坐標的話, 可能會出現因pdf大小, 縮放, 蓋章…

ASP.NET Core API + MySql

環境 數據庫&#xff1a; mysql8.0 后端&#xff1a; vs2022 ASP.NET Core API .net 8 前端&#xff1a; Hbuilderx bootstrap 5.3.0 jquery v3.7.1 bootstrap-table 1.23.5 創建項目 添加資源包 AutoMapper Microsoft.EntityFrameworkCore.Tools 8.0.0 Pomelo.EntityFramew…

RFDiffusion 計算鍵角函數get_ang解讀

get_ang 函數&#xff08;kinematics.py包中&#xff09;計算三組原子 a,b,c 所形成的平面角&#xff08;planar angle&#xff09;&#xff0c;即 b 為頂點&#xff0c; a,b,c 所確定的角度。 源代碼&#xff1a; def get_ang(a, b, c):"""calculate planar …

Bananna Pi開源社區聯合矽昌通信打造開源的低成本Wifi5路由器

香蕉派 BPI-Wifi5 路由器采用矽昌SF19A2890S2芯片方案設計。它是一款高性能無線路由器&#xff0c;適用于小微企業、家庭和其他網絡環境。Banana Pi開源社區提供整體解決方案。所有代碼開源&#xff0c;用戶可以在上面自由開發自己的應用。 Banana Pi wifi5 路由器github代碼: …

圖像融合算法筆記2024 CDTNet

目錄 ControlCom-Image-Composition CDTNet-High-Resolution-Image-Harmonization 依賴項: trilinear 推理代碼ok: ControlCom-Image-Composition diffusesion https://github.com/bcmi/ControlCom-Image-Composition CDTNet-High-Resolution-Image-Harmonization

item2 for macos

安裝Item2 brew install iterm2 查看終端類型 cat /etc/shells Mac OS X 10.15 已經將默認的shell從Bash換成了zsh&#xff0c;所以不用安裝&#xff0c;10.15以前的可以使用下面的命令進行安裝 brew install zsh 安裝Oh My ZSH # curl sh -c "$(curl -fsSL https://ra…

https證書生成、linux 生成https證書、nginx 配置https證書

1. 檢查 Certbot 是否已安裝 which certbot 2. 安裝 Certbot 2.1啟用 EPEL 倉庫&#xff08;如果尚未啟用&#xff09;&#xff1a; sudo yum install epel-release 2.2 安裝 Certbot 和 Nginx 插件&#xff1a; sudo yum install certbot python3-certbot-nginx 2.3驗證安…

Pytest-Bdd-Playwright 系列教程(14):Docstring 參數

Pytest-Bdd-Playwright 系列教程&#xff08;14&#xff09;&#xff1a;Docstring 參數 前言一、什么是docstring?二、基本語法三、主要特點四、實際例子五、注意事項六、使用建議總結 前言 在自動化測試的過程中&#xff0c;我們經常需要處理復雜的測試數據或需要輸入多行文…

手機租賃系統開發指南一站式服務流程解析

內容概要 手機租賃系統的開發是一個復雜但有趣的過程&#xff0c;像搭建樂高一樣&#xff0c;只要找到合適的模塊&#xff0c;就能打造出一個賓至如歸的租賃平臺。在這部分&#xff0c;我們將對開發流程的整體結構進行簡要概述&#xff0c;并指出每個環節的重要性。 首先&…

OpenAI 正式賦予 ChatGPT 通過視頻實時與用戶互動的能力

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

深入了解C++中const的用法

文章目錄 一、C中的const如何理解&#xff1f;二、C中的const與C語言中的const有何區別&#xff1f;三、const與指針、引用的結合使用 一、C中的const如何理解&#xff1f; 在C中&#xff0c;const是一個關鍵字&#xff0c;用來表示常量性&#xff0c;意在告訴編譯器某些變量或…

EasyExcel設置表頭上面的那種大標題(前端傳遞來的大標題)

1、首先得先引用easyExcel的版本依賴&#xff0c;我那 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version> </dependency> 2、然后得弄直接的實體類&#xff0c;&…

純血鴻蒙崛起,原生Android挑戰?兩大操作系統巔峰對決,智能設備未來誰主沉浮?

鴻蒙HarmonyOS和原生Android系統雖然在一些方面相似&#xff0c;但在架構、設計理念、API、開發工具等方面存在一些差異。鴻蒙系統的目標是跨設備、分布式的操作系統&#xff0c;強調多設備協同和資源共享&#xff0c;而Android則主要集中在智能手機和移動設備領域。 下面將從…

計算機網絡:傳輸層、應用層、網絡安全、視頻/音頻/無線網絡、下一代因特網

目錄 &#xff08;五&#xff09;傳輸層 1&#xff0e;傳輸層尋址與端口 2&#xff0e;無連接服務與面向連接服務 3. 傳輸連接的建立與釋放 4. UDP 的優點 5. UDP 和 TCP 報文段報頭格式 6. TCP 的流量控制 7&#xff0e;TCP 的擁塞控制 8. TCP 傳送連接的管理 &#…

【前端開發】HTML+CSS網頁,可以拿來當作業(免費開源)

HTML代碼 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content_lizhongyu"widthdevice-width, initial-scale1.0"><title>小兔鮮兒-新鮮、惠民、快捷<…

CV(4)--邊緣提取和相機模型

前言 僅記錄學習過程&#xff0c;有問題歡迎討論 邊緣提取&#xff08;涉及語義分割&#xff09;&#xff1a; 圖象的邊緣是指圖象局部區域亮度變化顯著的部分,也有正負之分&#xff0c;暗到亮為正 求邊緣的幅度&#xff1a;sobel&#xff0c;Canny算子 圖像分高頻分量和低…

【信息系統項目管理師】高分論文:論信息系統項目的整合管理(陽光信訪工作平臺)

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 正文一、明確目標,制定項目章程二、精心規劃,制定項目管理計劃三、細心嚴謹,指導和管理項目執行四、組織學習,管理項目知識五、多措并舉,對項目進行有效的監控六、規范流程,控制項目整體變更七、嚴謹高效…

智能技術引領未來:自動圖像標注的創新應用與發展

&#x1f351;個人主頁&#xff1a;Jupiter. &#x1f680; 所屬專欄&#xff1a;傳知代碼 歡迎大家點贊收藏評論&#x1f60a; 目錄 概述算法原理核心邏輯效果演示使用方式參考文獻 參考文獻&#xff1a;需要本文的詳細復現過程的項目源碼、數據和預訓練好的模型可從該地址處獲…