前言

本文介绍另一种学习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

【Net】ABP框架学习之正面硬钢的更多相关文章

  1. ABP 框架学习-01篇

    从来没有自己写过太多的技术性文章,博客里面的文章都是拷贝别人的东西,做一个笔记功能给自己用的.最近觉得应该写点自己的学习博客 https://aspnetboilerplate.com/ ABP框架, ...

  2. 【Net】ABP框架学习之它并不那么好用

    前言 上一篇文章介绍了ABP的Web API,本文在继续介绍ABP的其他内容. 在ABP中,WEBAPI是一个值得用的东西.但其他东西,就不一定是那么好用了. 下面我们看一下ABP的Controlle ...

  3. ABP框架学习

    一.总体与公共结构 1,ABP配置 2,多租户 3,ABP Session 4,缓存 5,日志 6,设置管理 7,Timing 8,ABPMapper 9,发送电子邮件 二.领域层 10,实体 11, ...

  4. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  5. 老周的ABP框架系列教程 -》 一、框架理论初步学习

    老周的ABP框架系列教程 -- 一.框架理论初步学习   1. ABP框架的来源与作用简介 1.1  简介 1.1.1       ABP框架全称为"ASP.NET Boilerplate ...

  6. ABP框架源码学习之修改默认数据库表前缀或表名称

    ABP框架源码学习之修改默认数据库表前缀或表名称 1,源码 namespace Abp.Zero.EntityFramework { /// <summary> /// Extension ...

  7. 2019 年起如何开始学习 ABP 框架系列文章-开篇有益

    2019 年起如何开始学习 ABP 框架系列文章-开篇有益 [[TOC]] 本系列文章推荐阅读地址为:52ABP 开发文档 https://www.52abp.com/Wiki/52abp/lates ...

  8. 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问

    中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...

  9. 基于ASP.NET MVC的ABP框架入门学习教程

    为什么使用ABP 我们近几年陆续开发了一些Web应用和桌面应用,需求或简单或复杂,实现或优雅或丑陋.一个基本的事实是:我们只是积累了一些经验或提高了对,NET的熟悉程度. 随着软件开发经验的不断增加, ...

随机推荐

  1. 不一样的ZTree,权限树.js插件

    每一个有趣的创新,都源于苦逼的生活. 在最近的工作中,遇到一个做权限管理筛选的需求.简单总结需求:1展示一个组织中的组织结构2通过点击组织结构中的任意一个节点可以向上向下查询对应的组织结构 如果你不想 ...

  2. go 下载qq音乐

    //go下载qq音乐 package main import ( _ "fmt" jsoniter "github.com/json-iterator/go" ...

  3. jQuery上传文件按钮美化

    效果图如下: 思路: 1:打开文件设置为透明,外面包一层标签,给标签设置颜色背景,给人点击浏览其实是点击打开文件的错觉.(给外标签相对定位,打开文件标签绝对定位). 2:点击浏览后,选择了文件,就把文 ...

  4. 「从零单排HBase 04」HBase高性能查询揭秘

    先给结论吧:HBase利用compaction机制,通过大量的读延迟毛刺和一定的写阻塞,来换取整体上的读取延迟的平稳. 1.为什么要compaction 在上一篇 HBase读写 中我们提到了,HBa ...

  5. .NET实现一个简单的IOC容器

    目录 1.主要细节 2.具体示例 参考及示例代码下载 shanzm-2020年3月17日 20:06:01 1.主要细节 使用反射程序集的方式获取对象的类型 通过反射的方式获取指定类型的的所有公共属性 ...

  6. Antd 表格内通过rowClassName实现隔行变色的显示方法(转载)

    ant design中 table组件很方便,在项目中遇到了需要实现奇偶行颜色不同以方便阅读的功能,主要用到了rowClassName这一api,通过判断index的奇偶来实现不同的样式分配. row ...

  7. HDU 5448 Marisa’s Cake

    给定一个由n个整点构成的凸多边形,求从n个点里任意选不少于3个点组成的所有凸多边形的面积之和,显然整点构成的多边形面积一定是0.5的整数倍,所以题目需要你算出答案的2倍 mod1000000007的值 ...

  8. Deepin中安装使用好用的字典GoldenDict

    2020-03-21   23:08:17 不说废话直接来安装步骤: 打开Deepin的应用商店,输入GoldenDict查找: 找到后点击安装,然后等待一小会,电脑提示音告诉你已经安装完成: 然后再 ...

  9. 项目部署Django+celery+redis

    celery介绍 1.celery应用举例 1.Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,   如果你的业务场景中需要用到异步任务,就可以 ...

  10. RestFul API 统一格式返回 + 全局异常处理

    一.背景 在分布式.微服务盛行的今天,绝大部分项目都采用的微服务框架,前后端分离方式.前端和后端进行交互,前端按照约定请求URL路径,并传入相关参数,后端服务器接收请求,进行业务处理,返回数据给前端. ...