手工搭建ABP框架(1) - Web項目

来源:http://www.cnblogs.com/skabyy/archive/2017/11/06/7295533.html
-Advertisement-
Play Games

為了防止不提供原網址的轉載,特在這裡加上原文鏈接: http://www.cnblogs.com/skabyy/p/7295533.html ABP是 ASP.NET Boilerplate Project 的簡稱。ABP是基於 DDD (領域驅動設計)的框架。ABP包含眾多組件,包括依賴註入、動態 ...


為了防止不提供原網址的轉載,特在這裡加上原文鏈接:
http://www.cnblogs.com/skabyy/p/7295533.html

ABP是 ASP.NET Boilerplate Project 的簡稱。ABP是基於DDD(領域驅動設計)的框架。ABP包含眾多組件,包括依賴註入、動態API、審計日誌、許可權控制等等。在大部分的ABP教材中,會推薦使用模板(https://aspnetboilerplate.com/Templates)來創建ABP工程。然而在實際使用中(至少在我的情況里)一般都需要手工搭建框架而非使用模板。手工搭建有下麵幾個好處:

  1. 模板創建的工程有很多不需要的東西需要調整或刪除,手工搭建免去了這些麻煩;
  2. 手工搭建框架能更自由地根據實際需求進行自定義配置和擴展;
  3. 手工搭建能幫助你更深入地理解ABP框架。

由於手工搭建ABP框架材料較少,我搭建時踩了不少坑。所以在這裡記錄一下搭建框架的核心步驟,以免以後重新摸索,同時與大家分享,歡迎拍磚。下麵我們以開發一個簡單的微博應用為例來展示如何使用ABP框架。

新建VS項目

用VS新建Web MVC項目,項目名稱為MyTweet.Web。同時新建解決方案,解決方案名稱為MyTweet要註意的一點是ABP只支持.NET 4.6以上版本,所以新建項目時記得選.NET Framework 4.6以上的版本

接下來,我們遵循DDD的原則,新建以下幾個層次的項目:

  1. 展現層(Presentation),負責用戶界面與用戶交互。在我們這個應用中,展現層是.NET MVC,包括Controller以及前端代碼,實現在項目MyTweet.Web中。
  2. 應用層(Application),負責展現層與領域層之間的協調。實現在項目MyTweet.Application中。
  3. 領域層(Domain),負責業務對象與業務邏輯。實現在項目MyTweet.Domain中。
  4. 基礎設施層(Infrastructure),提供一些通用的方法。實現在項目MyTweet.Infrastructure中。

新建好項目後,還需要設置引用依賴關係。在此不再贅述。

安裝ABP相關的NuGet包

安裝Abp包到所有項目。

安裝Abp.Web.MvcAbp.Web.ApiMyTweet.Web

創建模塊

ABP提供了模塊系統。使用模塊能方便地管理各個組件的初始化與依賴關係。一般來說,每個項目都會建一個模塊。由於本篇只用到了MyTweet.WebMyTweet.Application,所以先只新建這兩個模塊。

MyTweet.Application目錄下新建類MyTweetApplicationModule,並繼承自AbpModule。如圖:

模塊中的Initialize方法定義了模塊初始化時執行的操作。目前只做了IoC依賴註入的操作。

另外,在MyTweet.Web/App_Start目錄下新建類MyTweetWebModule,同樣也需要繼承自AbpModule,並且,這個模塊還需要依賴AbpWebApiModule(WebAPI需要這個模塊),MyTweetApplicationModule。如圖:

最後,為了讓程式運行時能識別並執行模塊,需要修改入口方法。.NET MVC的入口方法在Global.asax.cs文件中,如下圖,MvcApplication修改為繼承AbpWebApplication<MyTweetWebModule>,並相應地修改Application_Start方法。

WebAPI

我們使用WebAPI的方式定義前後端交互的介面。當然,直接使用MVC的方法也是可以的。這裡只是單純為了試用ABP動態WebAPI的用法而使用的WebAPI。

我們將實現兩個介面:

  1. GetTweets介面,GET方法,用於查詢出所有微博。
  2. CreateTweet介面,POST方法,用於新增一條微博。

因為我們還沒實現資料庫訪問功能,所以現在還不會真正實現這兩個介面,這兩個介面現在只讓它們返回一些測試數據。

在ABP框架下實現WebAPI十分方便,ABP能夠使用反射的方法自動從應用層AppService的public方法生成WebAPI介面。只需在MyTweetModule的初始化方法添加代碼定義動態ApiController生成規則:

這些代碼會在MyTweetApplicationModule的程式集中,將所有IApplicationService的實現類動態生成ApiController,並且根據方法名對public方法綁定相應的HTTP Method動詞。
比如,GetTweets綁定為GET方法,PutTweet綁定為PUT方法,其他名稱的方法像CreateTweet綁定為POST方法。
(這裡有一個例外,Get開頭的方法如果參數是一個object——一個DTO的話,那這個方法會被綁定為POST方法。)
生成的WebAPI介面的訪問路徑為/api/services/MyTweet/{AppSvcName}/{ActionName},其中{AppSvcName}IApplicationService實現類的類名(去掉尾碼AppService),{ActionName}是方法名。

接下來我們實現GetTweetsCreateTweet兩個介面:

現在只是簡單的讓這兩個介面隨便返回一些結果。GetTweets是接收一個字元串參數的GET介面,CreateTweet是接收一個字元串s、一個整數s的POST介面(C#與JavaScript對大小寫的編碼規範不同是一件很煩人的事,幸好ABP框架做了自動轉換)。這兩個介面的路徑分別為/api/services/MyTweet/MyTweet/GetTweets/api/services/MyTweet/MyTweet/CreateTweet

最後測試一下,運行MyTweet.Web項目,GET介面直接在瀏覽器就能訪問:

POST介面可以用Postman工具來訪問:

大功告成!

你訪問API的時候可能會出現"Empty or invalid anti forgery header token"的錯誤,這是因為某些ABP版本預設開啟了CSRF防禦。在MyTweetWebModulePreInitialize方法加上下麵這行代碼關閉CSRF防禦就可以了。

Configuration.Modules.AbpWeb().AntiForgery.IsEnabled = false;

Abp Module

最後簡要介紹下ABP的模塊系統。更詳細的講解可查閱官網的文檔https://aspnetboilerplate.com/Pages/Documents/Module-System

模塊主要用來管理系統初始化和關閉時要執行的操作。ABP在系統初始化和關閉時根據模塊間依賴關係執行相應的操作。

定義一個模塊只需要繼承AbpModule。我們可以用DependsOn標簽來聲明模塊間的依賴關係(ABP框架會自動解析依賴關係,但建議使用顯式的聲明)。

一個模塊會有如下方法,我們可以重載這些方法來定義模塊初始化/關閉時要做的操作:

  • PreInitialize:預初始化
  • Initialize:初始化
  • PostInitialize:後初始化
  • Shutdown:關閉

應用啟動時會根據模塊的依賴順序進行初始化。比如有模塊A和模塊B,模塊A依賴模塊B,那麼初始化的執行順序為:

  1. B的PreInitialize
  2. A的PreInitialize
  3. B的Initialize
  4. A的Initialize
  5. B的PostInitialize
  6. A的PostInitialize

關閉則按照依賴相反順序:

  1. A的Shutdown
  2. B的Shutdown

最後還有一個問題:應用啟動時,ABP框架如何知道要初始化哪些模塊?答案在入口函數方法:

ABP框架解析MyTweetModule所依賴的模塊,按順序初始化這些模塊(包括MyTweetModule)。


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

-Advertisement-
Play Games
更多相關文章
  • 新的剛來到,舊的就忘掉。學習 AspNet Core 2.0,沒有好的例子,是很痛苦的。《Pro ASP.NET Core MVC 2》中的 SportsStore 值得一看,不妨下載研究一下: 準備 1. 使用 Ubuntu 系統 2. 安裝 NetCore2.0 3. 安裝 VSCode 4. ...
  • 最近開發一個新項目,使用了asp.net core 2.0,採用webapi開發後臺,postgresql為資料庫。最先來的問題就是上傳文件的問題。 POST文件的一些坑 使用預設模板創建webapi的controller後,post請求,預設有 請求使用了 標記,用來指示用請求體里獲得數據。 對於 ...
  • 本次是結合近乎免費源碼版產品代碼進行的介紹,關於近乎產品下載可以訪問:www.jinhusns.com 下載免費源碼版本瞭解。 ...
  • 一、Model層 二、控制器層 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 using Mvc_Demo. ...
  • 首先,寫這篇文章的原因是因為最近某一個項目中的介面被人為調用了,導致了資料庫數據被串改。雖然是內部人無意點的,但還是引起了我的擔憂,所有整理了下關於Webapi的相關簽名機制。 一、我們在開發介面時,有時候嫌麻煩就懶進行相關的驗證或只進行一些簡單的驗證,這樣客戶端就可以直接調用:如 調用Webapi ...
  • --DateTime 數字型 System.DateTime currentTime=new System.DateTime(); 取當前年月日時分秒 currentTime=System.DateTime.Now; 取當前年 int 年=currentTime.Year; 取當前月 int 月=c ...
  • 在web.config 配置文件增加以下節點配置信息: <!--支持跨域--> <system.webServer> <httpProtocol> <customHeaders> <!-- 指定請求的方式 --> <add name="Access-Control-Allow-Methods" va ...
  • 之前在開發中只用到List的時候幾乎就是拿過來就用,從來沒有考慮過List的記憶體分配問題,試想一個有10萬元素的List的在構造和添加元素時記憶體是如何變化的呢?在MSDN上關於List的Capacity屬性是這麼解釋的,也就是說,當我們添加的元素數量小於等於Capacity的值時,List是不會重新 ...
一周排行
    -Advertisement-
    Play Games
  • PasteSpider是什麼? 一款使用.net編寫的開源的Linux容器部署助手,支持一鍵發佈,平滑升級,自動伸縮, Key-Value配置,項目網關,環境隔離,運行報表,差量升級,私有倉庫,集群部署,版本管理等! 30分鐘上手,讓開發也可以很容易的學會在linux上部署你得項目! [從需求角度介 ...
  • SQLSugar是什麼 **1. 輕量級ORM框架,專為.NET CORE開發人員設計,它提供了簡單、高效的方式來處理資料庫操作,使開發人員能夠更輕鬆地與資料庫進行交互 2. 簡化資料庫操作和數據訪問,允許開發人員在C#代碼中直接操作資料庫,而不需要編寫複雜的SQL語句 3. 支持多種資料庫,包括但 ...
  • 在C#中,經常會有一些耗時較長的CPU密集型運算,因為如果直接在UI線程執行這樣的運算就會出現UI不響應的問題。解決這類問題的主要途徑是使用多線程,啟動一個後臺線程,把運算操作放在這個後臺線程中完成。但是原生介面的線程操作有一些難度,如果要更進一步的去完成線程間的通訊就會難上加難。 因此,.NET類 ...
  • 一:背景 1. 講故事 前些天有位朋友在微信上丟了一個崩潰的dump給我,讓我幫忙看下為什麼出現了崩潰,在 Windows 的事件查看器上顯示的是經典的 訪問違例 ,即 c0000005 錯誤碼,不管怎麼說有dump就可以上windbg開幹了。 二:WinDbg 分析 1. 程式為誰崩潰了 在 Wi ...
  • CSharpe中的IO+NPOI+序列化 文件文件夾操作 學習一下常見的文件、文件夾的操作。 什麼是IO流? I:就是input O:就是output,故稱:輸入輸出流 將數據讀入記憶體或者記憶體輸出的過程。 常見的IO流操作,一般說的是[記憶體]與[磁碟]之間的輸入輸出。 作用 持久化數據,保證數據不再 ...
  • C#.NET與JAVA互通之MD5哈希V2024 配套視頻: 要點: 1.計算MD5時,SDK自帶的計算哈希(ComputeHash)方法,輸入輸出參數都是byte數組。就涉及到字元串轉byte數組轉換時,編碼選擇的問題。 2.輸入參數,字元串轉byte數組時,編碼雙方要統一,一般為:UTF-8。 ...
  • CodeWF.EventBus,一款靈活的事件匯流排庫,實現模塊間解耦通信。支持多種.NET項目類型,如WPF、WinForms、ASP.NET Core等。採用簡潔設計,輕鬆實現事件的發佈與訂閱。通過有序的消息處理,確保事件得到妥善處理。簡化您的代碼,提升系統可維護性。 ...
  • 一、基本的.NET框架概念 .NET框架是一個由微軟開發的軟體開發平臺,它提供了一個運行時環境(CLR - Common Language Runtime)和一套豐富的類庫(FCL - Framework Class Library)。CLR負責管理代碼的執行,而FCL則提供了大量預先編寫好的代碼, ...
  • 本章將和大家分享在ASP.NET Core中如何使用高級客戶端NEST來操作我們的Elasticsearch。 NEST是一個高級別的Elasticsearch .NET客戶端,它仍然非常接近原始Elasticsearch API的映射。所有的請求和響應都是通過類型來暴露的,這使得它非常適合快速上手 ...
  • 參考delphi的代碼更改為C# Delphi 檢測密碼強度 規則(仿 google) 仿 google 評分規則 一、密碼長度: 5 分: 小於等於 4 個字元 10 分: 5 到 7 字元 25 分: 大於等於 8 個字元 二、字母: 0 分: 沒有字母 10 分: 全都是小(大)寫字母 20 ...