【Net】ABP框架學習之正面硬鋼

来源:https://www.cnblogs.com/kiba/archive/2020/04/07/12524915.html
-Advertisement-
Play Games

前言 本文介紹另一種學習ABP框架的方法,該方法為正面硬鋼學習法。。。 我們不去官網下載模板,直接引用DLL,直接使用。 WebApi項目創建 首先創建一個WebApi項目,結構如下。 然後Nuget搜索ABP,安裝ABP框架。(我這裡安裝的是5.1.0,因為最高版本安裝不上) 在安裝ABP前先檢查 ...


前言

本文介紹另一種學習ABP框架的方法,該方法為正面硬鋼學習法。。。

我們不去官網下載模板,直接引用DLL,直接使用。

WebApi項目創建

首先創建一個WebApi項目,結構如下。

然後Nuget搜索ABP,安裝ABP框架。(我這裡安裝的是5.1.0,因為最高版本安裝不上)

在安裝ABP前先檢查當前安裝的Microsoft.AspNet.WebApi版本,因為ABP5.1.0依賴的是WebApi的5.2.7,如果WebApi不是5.2.7,在Nuget包管理—程式包管理器控制臺中輸入Update-Package Microsoft.AspNet.WebApi -Version 5.2.7來升級一下。(Get-Package查看已安裝包的信息)

然後修改Global.asax,修改代碼如下:

using Abp.Web;
using ABPWebApi;
using System;
using System.Web;
[assembly: PreApplicationStartMethod(typeof(PreStarter), "Start")]
namespace ABPWebApi
{
    public class WebApiApplication : Abp.Web.AbpWebApplication<SdudentApiServiceModule>
    {
        protected override void Application_Start(object sender, EventArgs e)
        { 
            base.Application_Start(sender, e);
        } 
    }
    public static class PreStarter
    {
        public static void Start()
        {     //WebApiApplication.AbpBootstrapper.PlugInSources.AddToBuildManager();
        }
    }
}

這裡WebApiApplication不再繼承System.Web.HttpApplication,改為繼承ABP框架下的Abp.Web.AbpWebApplication;因此原生框架提供的Application_Start不再需要,代碼里重寫了ABP的Application_Start,這樣我們就找到了Application_Start,可以在啟動時做自己想做的事情了。

AbpWebApplication是個泛型,要求指定預設啟動模塊的類,這裡我們先寫上SdudentApiServiceModule,下麵會創建這個類。

在Global中,還使用PreApplicationStartMethod做了一些啟動預處理,比如載入一些插件,當然也可以什麼都不做。

如果要載入插件或者做一些其他操作,則需要再引入ABP.WEB,因為一些配置的依賴庫在這裡,這裡同樣引用5.1.0版本。

因為使用了ABP框架,所以我們不再需要微軟提供的預設佈局了,下麵我們微軟的預設佈局文件夾刪除;如下圖:

現在我們新建一個類庫,創建一個SdudentApi模塊,用來編寫可以被HTTP訪問的介面。

創建完類庫後,我們需要在類庫里添加一個自定義類,來標記,這個類庫是WebApi服務模塊。

創建SdudentApiServiceModule類,並繼承AbpModule。

很明顯AbpModule在SdudentApi類庫是未被引用的,所以我們要引用一下ABP的框架。

因為這個模塊是WebApi,所以我們直接引用Abp.Web.Api5.1.0就可以了。(由於Abp.Web.Api依賴於Abp,所以Abp也會被同時引入)

現在我們編輯SdudentApiServiceModule類。

因為繼承了AbpModule,所以我們可以override它PreInitialize,Initialize,PostInitialize,Shutdown;它們分別是模塊初始化前,中,後和關閉。(只有被載入和關閉時調用這些方法,調用API方法時,這些不觸發)

下麵我們編寫下SdudentApiServiceModule,代碼如下:

[DependsOn(typeof(Abp.WebApi.AbpWebApiModule))]
    public class SdudentApiServiceModule : AbpModule
    {
        public override void PreInitialize()
        {
            Configuration.Modules.AbpWeb().AntiForgery.IsEnabled = false;
            Configuration.Modules.AbpWebCommon().SendAllExceptionsToClients = true;  
        }
        public override void Initialize()
        {
            //按照約定,ABP自動註冊所有 Repositories, Domain Services, Application Services, MVC 控制器和Web API控制器
            //ABP按照約定註冊程式集,下麵代碼將告訴ABP要註冊當前程式集。
            IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
            //動態ApiController創建需要在將當前程式集註冊進ABP後,才可以調用
            //WebApi訪問路徑預設首碼api/services,Sdudent是我們追加的首碼,可以自定義,例如Sdudent/Task
            //外放成ApiController的服務需要繼承ABP的IApplicationService介面,需要準守命名約定,這樣才能被搜索到(服務命名約定:服務名+AppService,例如SearchSdudentAppService) 
            Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder
            .ForAll<IApplicationService>(Assembly.GetAssembly(typeof(SdudentApiServiceModule)), "Sdudent").Build();  
        } 
        public override void PostInitialize()
        { 
        } 
        public override void Shutdown()
        {   
        }
    }

首先我們為SdudentApiServiceModule添加依賴[DependsOn(typeof(Abp.WebApi.AbpWebApiModule))],這是因為,ABP都是通過Castle進行依賴控制反轉實例化對象的,所以,在實例化SdudentApiServiceModule時,如果它依賴的類沒有被裝載,它就會報錯,因為我們在寫WebApi,所以很明顯,我們依賴Abp.WebApi.AbpWebApiModule這個模塊。

PreInitialize:這裡我們Http請求的簡單配置,還可以繼續配置,ABP配置很多。

Initialize:這裡將當前類裝載進ABP,同時動態創建了ApiController。

PostInitialize和Shutdown暫時無操作。


現在我們創建服務(它們將被轉換成ApiController)。

創建介面ISearchSdudentAppService,代碼如下:

public interface ISearchSdudentAppService :  IApplicationService
    {
        [HttpGet]
        string GetSdudent();
    }

註意介面方法需要加[HttpGet],不加的會被預設註冊為Post,測試時會出現無法訪問的問題。

創建服務SearchSdudentAppService,代碼如下:

public class SearchSdudentAppService: ISearchSdudentAppService
    { 
        public string GetSdudent()
        {
            return "I am a Sdudent";
        }
    }

SdudentApiServiceModule編寫完成,現在我們運行項目測試一下。

 如上圖,訪問成功。

Url解析:這裡我們訪問的URL是/api/services/Sdudent/SearchSdudent/GetSdudent。

其中/api/services是預設首碼,Sdudent/是我們自定義首碼,SearchSdudent是Controler名,它是根據服務名來的,服務名減去約定名(SearchSdudentAppService-AppService),GetSdudent是Action名,就是服務里的方法名。


跨域配置

Nuget搜索Microsoft.AspNet.WebApi.Cors,安裝與Microsoft.AspNet.WebApi相同版本號的Cors。

SdudentApiServiceModule模塊的PreInitialize方法里追加配置。

var cors = new EnableCorsAttribute("*", "*", "*");
GlobalConfiguration.Configuration.EnableCors(cors);

Filter配置

在SdudentApiServiceModule模塊創建ExceptionFilter類,代碼如下:

public class ExceptionFilter : IExceptionFilter, ITransientDependency
{
    public bool AllowMultiple => true; 
    public async Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
    {
        await Task.Run(()=>
        {
​
            if (actionExecutedContext == null)
            {
​
                return;
            }
            if (actionExecutedContext.Exception == null)
            {
                return;
            }
            //記錄actionExecutedContext.Exception
        }); 
    } 
}

在SdudentApiServiceModule類的PostInitialize里配置Fliter。

public override void PostInitialize()
{
    GlobalConfiguration.Configuration.Filters.Add(new ExceptionFilter());
} 

模塊依賴

依照上文,在創建一個TeacherApi模塊,然後修改Global的啟動模塊為TeacherApiServiceModule,然後引入SdudentApi項目。

然後編寫TeacherApiServiceModule代碼如下:

[DependsOn(typeof(Abp.WebApi.AbpWebApiModule), typeof(SdudentApiServiceModule))]
public class TeacherApiServiceModule : AbpModule
{
    private readonly SdudentApiServiceModule _SdudentApiServiceModule;
    public TeacherApiServiceModule(SdudentApiServiceModule sdudentApiServiceModule)
    {
        _SdudentApiServiceModule = sdudentApiServiceModule;
    }
    public override void PreInitialize()
    {
        Configuration.Modules.AbpWeb().AntiForgery.IsEnabled = false;
        Configuration.Modules.AbpWebCommon().SendAllExceptionsToClients = true; 
    }
    public override void Initialize()
    { 
        IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); 
        Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder
        .ForAll<IApplicationService>(Assembly.GetAssembly(typeof(TeacherApiServiceModule)), "Sdudent").Build(); 
    }
    public override void PostInitialize()
    {
        var ret =_SdudentApiServiceModule.GetSdudent();
        Console.WriteLine(ret);
    } 
    public override void Shutdown()
    {   
    }
}

如上代碼所示,我們在DependsOn上追加SdudentApiServiceModule依賴,然後在TeacherApiServiceModule的構造函數里,使用SdudentApiServiceModule類型參數,然後運行時參數就會被實例化,並註入進來。

現在我們訪問TeacherApi的訪問,把TeacherApiServiceModule模塊調用起來,看下模塊的PostInitialize里,是否成功調用了SdudentApiServiceModule模塊的方法。

如上圖,依賴調用成功。

Swagger配置

Nuget搜索Swashbuckle.core。

模塊下添加函數

private void ConfigureSwaggerUi()
{
    Configuration.Modules.AbpWebApi().HttpConfiguration
        .EnableSwagger(c =>
        {
            c.SingleApiVersion("v1", "文檔");
            c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
        })
        .EnableSwaggerUi();
}

然後在Initialize()里調用該函數,配置完成。

然後運行項目,輸入swagger/ui/index,如下圖:

代碼已經傳到Github上了,歡迎大家下載。

github地址:https://github.com/kiba518/ApbWebApi

----------------------------------------------------------------------------------------------------

註:此文章為原創,任何形式的轉載都請聯繫作者獲得授權並註明出處!
若您覺得這篇文章還不錯,請點擊下方的推薦】,非常感謝!

https://www.cnblogs.com/kiba/p/12524915.html

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 在控制項模板和為其提供支持的代碼之間又一個隱含約定。如果使用自定義控制項模板替代控制項的標準模板,就需要確保新模板能夠滿足控制項的實現代碼的所有需要。 在簡單控制項中,這個過程比較容易,因為對模板幾乎沒有(或完全沒有)什麼真正的需求。對於複雜控制項,問題就顯得有些微妙了,因為控制項的外觀和實現不可能完全相互獨立的 ...
  • 效果圖預覽 新建MyCustomControl類。 public class MyCustomControl : Control { private static Storyboard MyStory; private ObjectAnimationUsingKeyFrames MyAnimatio ...
  • 在帶鍵盤滑鼠的電腦上編寫應用於觸屏電腦的項目,為了能輸入中文、英文、數字等各種庸人自擾。 一、自己畫了個鍵盤 為了實現能輸入中文,還簡單編寫了個拼音輸入法,各種折騰,始終不是很舒服。最後客戶要求手寫輸入中文,於是就完全放棄了。 二、折騰TabTip.exe win10的虛擬鍵盤是一個程式,即c:\P ...
  • 五、C#流程式控制制 5.1.if語句 1)結構 if(條件判斷表達式) { func1 }else { func2 } 5.2.switch語句 1)結構 switch(表達式) { case 常量表達式:條件語句;break; case 常量表達式:條件語句;break; case 常量表達式:條件 ...
  • IdentityServer 部署踩坑記 Intro 周末終於部署了 以及 項目,踩了幾個坑,在此記錄分享一下。 部署架構 項目是基於 "IdentityServerAdmin" 項目修改的,感謝作者的開源付出,有需要 IdentityServer 管理需求的可以關註一下,覺得好用的可以給個 sta ...
  • Insus.NET有在angularjs中把ng-repeat顯示數據的同時又讓其能更新數據。 html代碼如下: 當用戶點擊更新時,能獲取按鈕當前行的更新數據進行更新。 ...
  • @[toc] 開發 web api 的時候,寫文檔是個痛苦的事情,而沒有文檔別人就不知道怎麼調用,所以又不得不寫。 swagger 可以自動生成介面文檔,並測試介面,極大的解放了程式員的生產力。 1 安裝 通過 NuGet 安裝 Swashbuckle。 安裝完成後,App_Start 文件夾下會多 ...
  • 1.先上效果圖: 2.1t提示框界面。 主視窗界面沒什麼內容,就放了一個觸發按鈕。先繪製通知視窗(一個關閉按鈕,倆個文本控制項),可以設置下ResizeMode="NoResize" WindowStyle="None" Topmost="True", 去掉視窗標題,並使提示視窗始終處於最上層。 <B ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...