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

前言

本文介绍另一种学习ABP框架的方法,该方法为正面硬钢学习法。。。

我们不去官网下载模板,直接引用DLL,直接使用。

WebApi项目创建

首先创建一个WebApi项目,结构如下。

5ebd5aee411a099f209c3f9d0cb66c84.png

然后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查看已安装包的信息)

e721efe5de7bc2e61a3e2506fb3faa8e.png

然后修改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

{

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版本。

c423dafd7b1e2ca628cfa31eda73e331.png

因为使用了ABP框架,所以我们不再需要微软提供的默认布局了,下面我们微软的默认布局文件夹删除;如下图:

93266c8cb2ef6d06b124619eb3ed2c37.png

现在我们新建一个类库,创建一个SdudentApi模块,用来编写可以被HTTP访问的接口。

创建完类库后,我们需要在类库里添加一个自定义类,来标记,这个类库是WebApi服务模块。

创建SdudentApiServiceModule类,并继承AbpModule。

很明显AbpModule在SdudentApi类库是未被引用的,所以我们要引用一下ABP的框架。

因为这个模块是WebApi,所以我们直接引用Abp.Web.Api5.1.0就可以了。(由于Abp.Web.Api依赖于Abp,所以Abp也会被同时引入)

3e697ac1d616b02e5df6967a0469eaca.png

现在我们编辑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(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编写完成,现在我们运行项目测试一下。

a9a46b5e5c229298d8a3af394f78f115.png

如上图,访问成功。

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。

20e3170b2544893c5b786630cbd59216.png

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(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模块的方法。

9eb14f179691ebb1228fcdedec372a91.png

如上图,依赖调用成功。

Swagger配置

Nuget搜索Swashbuckle.core。

86bfa4345c39828f96f4844a2e298214.png

模块下添加函数

private void ConfigureSwaggerUi()

{

Configuration.Modules.AbpWebApi().HttpConfiguration

.EnableSwagger(c =>

{

c.SingleApiVersion("v1", "文档");

c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());

})

.EnableSwaggerUi();

}

然后在Initialize()里调用该函数,配置完成。

然后运行项目,输入swagger/ui/index,如下图:

0769446d4e9dc2f7bc3483dab708df89.png

代码已经传到Github上了,欢迎大家下载。

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

注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!

若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

6c7f68dbb604499be645eba635f2566d.png

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[【Net】ABP框架学习之正面硬钢]http://www.zyiz.net/tech/detail-124762.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浮躁的社会

今天去了趟百脑汇,原本是想看看手机,结果发现现在的私人手机卖场真的很山寨,百脑汇二楼整个都是手机的天下,但清一色的都是手机模型,偶尔有手机的也几乎是清一色的翻新机,其实手机的源头就是那么几个上家。…

不同对象的通话是时长​

1 一个专门为某人打造的形容词2 当代人的手机铃声3 “可以吃宵夜吗”“不行” 4 好可爱!!!5 这不是道具,是真的红酒杯里倒着红酒叠在硬币上!6 这14个未接电话就很有灵性了!7 你觉得以下哪个事件给你的痛苦感…

oslo.config资源

官方文档:http://docs.openstack.org/developer/oslo.config/cfg.html转载于:https://blog.51cto.com/6374820/1661405

poj 1088 滑雪 详解

http://poj.org/problem?id1088 这是一道dp入门题,不过我一直没想明白应该怎么dp。今天,在做自己学校oj的算法基础题时看到这题,标注着dp的分类,加上我一直都比较喜欢做dp题,于是我就决心今晚要把这道入门题切了。 题…

python find函数_Python 速学!不懂怎么入门python的小白看这篇就够了!

Python是一种非常流行的脚本语言,而且功能非常强大,几乎可以做任何事情,比如爬虫、网络工具、科学计算、树莓派、Web开发、游戏等各方面都可以派上用场。同时无论在哪种平台上,都可以用 Python 进行系统编程。本文讨论基本的 Pyth…

前端开发的盛宴

想写这篇文章由来已久,目的是想回顾一下基于Web技术的开发技术和流程的变迁,以及其背后的原因或规律。我依然记得,很多年前做出来第一个公司网站时的激动心情(加班到晚上,兴奋地在空旷的办公室走来走去)&am…

datav本地部署 java,Spring Boot对Spring Data JPA的自动配置

一 点睛Spring Boot对Spring Data JPA的自动配置放置在如下路径:二 源码分析1 JpaRepositoriesAutoConfiguration类分析ConfigurationConditionalOnBean(DataSource.class)ConditionalOnClass(JpaRepository.class)ConditionalOnMissingBean({ JpaRepositoryFactory…

解决ssh使用一段时间断开的问题

ssh连接到远程服务器,会在一段时间后自动断开,可以通过调整远程服务器ssh服务的参数解决。以下这个方法通过客户端解决。首先找到所在用户的.ssh目录,如root用户该目录在:/root/.ssh/在该目录创建config文件vi /root/.ssh/config加入下面一句…

靠拿奖学金完成学业后,博士生为女友放弃年薪30万工作选择留校任教

全世界只有3.14 % 的人关注了爆炸吧知识“相恋八年,一路陪伴。研究生毕业后,博士生决定为女友放弃年薪30万的工作选择留校任教,因为曾和女友约定一起当老师。好的科研爱情,或许就是这样携手前进。索长友是哈尔滨理工大学的博士生&…

小菜学设计模式——观察者模式

2019独角兽企业重金招聘Python工程师标准>>> 背景 上一次去看电影院看电影,半旁边的妹子说只要扫一扫就能免费领取爆米花一份,你说我怎么躲得过妹子的招数呢?所以拿起我的手机,扫一扫,注册会员&#xf…

获取 子文件夹 后缀_CSDN学院第一个Ptython Homework-- 递归统计文件夹大小

作业:通过第一周学习的内容,自主编写一个py文件,能够递归文件夹大小,并将统计后的大小进行格式化输出.作业体现形式:以代码的方式保存成后缀为py的脚本.作业的注意事项:1.文件名命名规范.2.注释清晰.3.运行结果符合预期效果 .思路提示:1.使用python内置的os模块来进行文件相关的…

android bitmap drawable 互转

引用: http://www.android123.com.cn/kaifafaq/704.html 很多开发者表示,不知道Android的Drawable和Bitmap之间如何相关转换。下面Android123给大家两种比较简单高效的方法。 一、Bitmap转Drawable Bitmap bmxxx; //xxx根据你的情况获取 BitmapDrawabl…

java 链表逆序 递归,java用递归和非递归实现链表逆序

传统的逆序链表方法是使用三个指针来记录节点的状态,防止链表断裂。Node节点public class Node {private int data;private Node next;public Node(int data){this.data data;next null;}public int getData() {return this.data;}public void setData(int data) …

WeihanLi.Npoi 1.21.0 Released

WeihanLi.Npoi 1.21.0 ReleasedIntroWeihanLi.Npoi 是一个基于 netstandard2.0 的一个 NPOI 扩展库,主要用于导入导出 Excel 以及 CSV,支持通过 Fluent API 的方式来支持非常灵活的导入导出配置,详细使用可以参考文档介绍以及项目示例 https:…

史上最硬核老师:17年间,拿着菜刀把400个混混送进了哈佛耶鲁麻省!

全世界只有3.14 % 的人关注了爆炸吧知识今天,来给大家介绍一位硬核教师Jaime Escalante——手握杰斐逊奖、自由精神奖,拿着菜刀把400个混混送进了哈佛耶鲁麻省。海梅斯埃斯卡兰特(Jaime Escalante)初出茅庐1930年12月31日,Jaime出生于玻利维亚…

钱钱语录

1)金钱有一些秘密和规律,要想了解这些秘密和规律,前提条件是,你自己必须真的有这个愿望。 2)如果你只是带着试试看的心态,那么你最后只会以失败而告终,你会一事无成。尝试纯粹是一种借口&#x…

数据库表设计

数据库表设计 分析上述各实体的属性集,从中找出关系的主键,然后用关系式来表示实体(其中下划线的属性为主键)。表4-1至表4-5分别给出了主要表结构各实体的属性如下: 表4-1 admin 表名称 主要字段 数据类型 长度 属性 输入方式 描述 …

大数据财税与python应用_大数据跟python

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

php 类中调用另类,PHP return语句另类用法不止是在函数中,return语句_PHP教程

PHP return语句另类用法不止是在函数中,return语句分享下PHP return语句的另一个作用,在bbPress的代码中看到的一个奇葩使用方法。一直以为,return只能出现在函数中,直到看了bbPress的代码:难道 return 还能出现在函数之外&#x…

抓包写代码模拟怎么减少重复劳动

由于工作需要会经常需要Fiddler抓包Chrome F12抓包然后根据抓包写代码来模拟,一般来说我都是先抓包,打开postman把抓来的包放到postman里面模拟请求然后利用PostMan的生成代码功能大部分的Reponse都是Json,为了方反列化接着要打开一个在线工具…