【Net】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
&n