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 你觉得以下哪个事件给你的痛苦感…

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…

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

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

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

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

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

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

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) …

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

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

数据库表设计

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

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

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

机械史上最复杂的巅峰之作,这才是最强大脑!

全世界只有3.14 % 的人关注了爆炸吧知识今天我们来认识一下机械史上最强大脑:英国数学家查尔斯巴贝奇,他是可编程计算机的发明者,计算机的先驱。他设计过的计算机器有差分机、分析机和第二个差分机。差分机可谓是机械史最复杂的巅峰之作。在英…

mybatis-plus 会自动增加 order by_python自动撸支付宝基金答题红包

python自动撸支付宝基金答题红包背景在一个套利撸羊毛群里,一群小伙伴每天在不懈地撸支付宝的基金红包,于是自己也加入了撸红包大军。于是就重复地在不同的基金里面,看有没有答题红包,有的话就点进去,回答一个及其容易…

C# WPF文本框TextEdit不以科学计数法显示

01—前言一个float或者double类型的数值,如果小数点后0的个数≥4,在界面上就会自动以科学计数法显示,比如:0.00003会显示成这样但是很多时候我并不希望它这样显示,因为这样不方便编辑,和界面其它数据格式也…

php 获取浏览器时区,获取用户时区

噜噜哒这将使您将时区作为PHP变量。我使用jQuery和PHP编写了一个函数。这是经过测试的&#xff0c;而且确实有效&#xff01;在希望将时区作为变量的PHP页面上&#xff0c;在页面顶部附近有以下代码片段&#xff1a;<?php session_start();$timezone $_SESSION[time];…

女生说话都是加密的

1 年纪轻轻就能过肩摔普京了&#xff0c;真黑带九段&#xff01;&#xff01;&#xff01;2 第一次知道蒜苔本身是这个样子的。。3 一只来自四川的兔子。。4 不敢自己坐电梯的大宝宝5 去睡沙发吧&#xff01;这里没有你的位置了&#xff01;6 虽然是拒绝但这个回复很棒&#xf…

52Exchange 2010升级到Exchange 2013-升级SH站点Ex2010到2013

20、升级SH站点Ex2010到201320.1 准备Exchange服务器两台前端两台后端的标准架构&#xff0c;准备四台EX2013服务器&#xff0c;已经部署成功&#xff0c;安装方法不再赘述进入到EAC中&#xff0c;可以看到所有EX服务器&#xff0c;包括EX2010和EX201320.2 配置SH-Site前端NLB安…

一问就打鼓,一用就糊涂,是我小看它了

听过一个说法&#xff0c;“10 个程序员里&#xff0c;10 个都说学过网络协议&#xff0c;9 个都说懂网络协议。”&#xff0c;但事实上&#xff0c;能真正轻松应对各个大厂校招/社招相关问题的&#xff0c;可能也就两三个。网络协议的不少问题都给人一种似懂非懂的感觉&#x…

Visio工具 UML的建模

&#xff35;&#xff2d;&#xff2c;描述模型的内容有三种 分别是  事物、关系和图事物有&#xff1a;类&#xff0c;接口&#xff0c;用例&#xff0c;组件&#xff0c;结点&#xff0c;交互&#xff0c;包&#xff0c;注释等类&#xff1a; 类分为三部分&#xff0c;顶部…