【Net】ABP框架学习之正面硬钢

前言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

 

相关文章
相关标签/搜索