前言html
本文介紹另外一種學習ABP框架的方法,該方法爲正面硬鋼學習法。。。git
咱們不去官網下載模板,直接引用DLL,直接使用。github
WebApi項目建立api
首先建立一個WebApi項目,結構以下。跨域
而後Nuget搜索ABP,安裝ABP框架。(我這裏安裝的是5.1.0,由於最高版本安裝不上)app
在安裝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查看已安裝包的信息)cors
而後修改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,能夠在啓動時作本身想作的事情了。async
AbpWebApplication是個泛型,要求指定默認啓動模塊的類,這裏咱們先寫上SdudentApiServiceModule,下面會建立這個類。ide
在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
----------------------------------------------------------------------------------------------------
注:此文章爲原創,任何形式的轉載都請聯繫做者得到受權並註明出處!
若您以爲這篇文章還不錯,請點擊下方的【推薦】,很是感謝!
http://www.javashuo.com/article/p-rbvzhyrg-mc.html