ASP.NET Core

介绍

  本文档描述了ABP如何集成ASP.NET Core。ASP.NET Core通过Abp.AspNetCore nuget包实现集成。

迁移到ASP.NET Core?

   如果你已经有一个工程并考虑迁移到ASP.NET Core,你可以阅读我们博客的帖子来了解我们迁移的经验。

启动模板

  你可以在启动模板创建一个工程,这是一个简单、空的web工程但是已经和ABP框架集成并进行了适当的配置。

配置

启动类

为了使ABP集成到ASP.NET Core,我们需要在Startup类里做一些更改,如下所示:

public class Startup
{
public IServiceProvider ConfigureServices(IServiceCollection services)
{
//... //Configure Abp and Dependency Injection. Should be called last.
return services.AddAbp<MyProjectWebModule>(options =>
{
//Configure Log4Net logging (optional)
options.IocManager.IocContainer.AddFacility<LoggingFacility>(
f => f.UseLog4Net().WithConfig("log4net.config")
);
});
} public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
//Initializes ABP framework and all modules. Should be called first.
app.UseAbp(); //...
}
}

模块配置

  你可以使用启动配置来配置AspNet Core模块(在模块的PreInitialize方法中使用Configuration.Modules.AbpAspNetCore())。

控制器

  在ASP.NET Core中控制器可以是任何类型的类。它不仅限制于继承自Controller的类。一个类以Controller(如ProductController)结尾就默认为MVC控制器。你也可以给任何类添加MVC的[Controller]特性使其成为一个控制器。这就是ASP.NET Core MVC工作的方式。参见ASP.NET Core文档了解更多。

  如果你使用web层的类(如HttpContext)或返回一个视图,最好继承AbpController(它从MVC的Controller继承)类。但是,如果你创建的API控制器仅仅使用对象,可以考虑创建一个POCO控制器类或者你可以按如下所描述的那样使用应用服务作为控制器。

应用服务作为控制器

  ABP提供了基础设施来创建应用服务。如果你想将应用服务作为控制器提供给远程客户端(可以像之前一样使用dynamic web api),你可以在模块的PreInitialize方法中通过一个简单配置来实现。示例:

Configuration.Modules.AbpAspNetCore().CreateControllersForAppServices(typeof(MyApplicationModule).Assembly, moduleName: 'app', useConventionalHttpVerbs: true);

  CreateControllersForAppServices 方法接收一个程序集,把程序集里所有的应用服务转换为MVC控制器。你可以使用RemoteService特性在方法或类级别来启用/禁用它。

  当一个应用服务转换为MVC控制器,默认路由为/api/services/<module-name>/<service-name>/<method-name>。例如:如果ProductAppService定义了一个Create方法,它的URL将为/api/services/app/product/create(假定模块的名字为'app')。

  如果useConventionalHttpVerbs设置为true(默认值为true),那么服务方法的HTTP动词由命名约定来决定:

  • Get:方法名以'Get'开始时使用。
  • Put:方法名以'Put'或'Update'开始时使用。
  • Delete:方法名以'Delete'或'Remove'开始时使用。
  • Post:方法名以'Post','Create'或'Insert'开始时使用。
  • Patch:方法名以'Patch'开始时使用。
  • 否则,Post默认使用的HTTP动词。

  你可以使用任何ASP.NET Core特性来改变HTTP方法或actions的路由(但是当然这需要添加相关ASP.NET Core包的引用)。 

  注意:之前,在给应用服务创建服务接口时需要动态wei api系统,但是对于ASP.NET Core集成不需要。同样,MVC特性应该添加到服务类,即使已经有接口。 

过滤器

  ABP为AspNet Core 定义了一些內建过滤器。默认所有的过滤器会添加到所有控制器的所有actions。

授权过滤器

  AbpAuthorizationFilter用来集成授权系统和特征系统。

  • 你可以为actions或controllers定义AbpMvcAuthorize特性来在执行前检查需求的权限。
  • 你可以为actions或controllers定义RequiresFeature特性来在执行前检查需求的特征。
  • 你可以为actions或controllers定义AllowAnonymous(或在应用层定义AbpAllowAnoymous)特性来禁止校验和授权。

审计Action过滤器

  AbpAuditActionFilter用来集成审计日志系统。它默认为所有的actions记录所有的请求(如果审计没有禁用)。你可以为actions和controllers使用AuditedDisableAuditing特性来控制审计日志。

校验过滤器

  AbpValidationActionFilter用来集成校验系统并自动为所有的actions校验输入。另外ABP內建校验和标准化,它检查MVC的Model.IsValid属性并抛出校验异常,如果action的输入有任何无效值。

  你可以为actions和controllers使用EnableValidationDisableValidation特性来控制校验。

工作单元Action过滤器

  AbpUowActionFilter用来集成工作单元系统。它在action执行前自动开始一个新的工作单元并在action结束后完成工作单元(如果没有异常抛出)。

  你可以使用UnitOfWork特性来控制action的UOW行为。你也可以使用启动配置来更改所有action的默认工作单元特性。

异常过滤器

  AbpExceptionFilter用来从controller actions中处理异常抛出。它处理并记录异常,然后返回包装的响应到客户端:

  • 它仅处理对象结果,不处理视图结果。所以,actions返回任何对象、JsonResult或者ObjectResult都会被处理。Action返回一个视图或任何其他实现了IActionsResult的结果类型不会被处理。建议使用在Microsoft.AspNetCore.Diagonistics包中內建的UseExceptionHandler扩展方法来处理视图异常。
  • 异常处理和日志行为可以为方法或类使用WrapResult和DontWrapResult特性来改变。

结果过滤器

  AbpResultFilter主要用来包装结果action,如果action执行成功的话。

  • 它仅包装JsonResult、OjectResult和任何没有实现IActionResult(还有相应的异步版本)的对象。如果你的action返回一个视图或任何其他类型的结果,都不会被包装。
  • WrapResultDontWrapResult特性可以用于方法和类来启用/禁用包装。
  • 你可以使用启动配置来更改结果包装的默认行为。

Ajax请求的结果缓存

  AbpResultFilter为AJAX请求的响应添加了Cache-Control头(no-cache,no-store)。因此,它阻止浏览器缓存AJAX响应甚至GET请求的响应。可以使用配置来禁用此功能。

模型绑定器

  AbpDateTimeModelBinder用来标准化DateTime(和Nullable<DateTime>)输入,使用Clock.Normalize方法。

视图

  MVC视图可以继承自AbpRazorPage来自动注入大多数使用的基础设施(LocalizationManager、PermissionChecker、SettingManager...etc)。它也有快捷方法(如L(...)来本地化文本)。启动模板默认继承它。

  你可以使你的web组件继承自AbpViewComponet而不是ViewComponent来使用基础属性和方法的优势。

客户端代理

  ABP可以自动为所有的MVC控制器(不仅仅是应用服务)创建javascript代理。它默认创建应用服务作为控制器(参见上面部分)。你可以为任何MVC控制器添加[RemoteService]特性来为它创建客户端代理。Javascript代理在运行时动态生成。你需要在page中添加指定的script定义:

<script src="~/AbpServiceProxies/GetAll?type=jquery" type="text/javascript"></script>

  当前,只有JQuery代理生成。然后我们可以使用javascript来调用一个MVC方法,如下所示:

abp.services.app.product.create({
name: 'My test product',
price: 99
}).done(function(result){
//...
});

集成测试

  对于ASP.NET Core而言,集成测试相当容易,它自己的网站上有详细的文档。ABP跟随这个导向并在Abp.AspNetCore.TestBase包中提供了AbpAspNetCoreIntegratedTestBase类。它使得集成测试更加简单。

  最好在启动模板里探究集成测试。

返回主目录

ABP官方文档翻译 6.2.1 ASP.NET Core集成的更多相关文章

  1. [Abp 源码分析]十七、ASP.NET Core 集成

    0. 简介 整个 Abp 框架最为核心的除了 Abp 库之外,其次就是 Abp.AspNetCore 库了.虽然 Abp 本身是可以用于控制台程序的,不过那样的话 Abp 就基本没什么用,还是需要集合 ...

  2. ABP官方文档翻译 10.1 ABP Nuget包

    ABP Nuget包 Packages Abp Abp.AspNetCore Abp.Web.Common Abp.Web Abp.Web.Mvc Abp.Web.Api Abp.Web.Api.OD ...

  3. ABP官方文档翻译 7.2 Hangfire集成

    Hangfire集成 介绍 ASP.NET Core集成 ASP.NET MVC 5.x集成 面板授权 介绍 Hangfire是一个综合的后台job管理器.你可以 把它集成到ABP,用来取代默认的后台 ...

  4. ABP官方文档翻译 0.0 ABP官方文档翻译目录

    一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...

  5. ABP官方文档翻译 2.1 依赖注入

    依赖注入 什么是依赖注入 传统方式的问题 解决方案 构造函数注入模式 属性注入模式 依赖注入框架 ABP依赖注入基础设施 注册依赖注入 传统注册 帮助接口 自定义/直接注册 使用IocManager ...

  6. Asp.Net Core 集成 Hangfire 配置使用 Redis 存储

    Hangfire 官方支持 MSSQL 与 Redis(Hangfire.Pro.Redis) 两种 ,由于我的数据库是 MYSQL ,粗略查询了一下文档,现在对 .NET Core 支持的并不够好, ...

  7. asp.net core 集成JWT(一)

    [什么是JWT] JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的令牌,可以使用JWT ...

  8. asp.net core 集成 log4net 日志框架

    asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...

  9. asp.net core集成MongoDB

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言及MongoDB的介绍 最近在整合自己的框架,顺便把MongoDBD的最简单CRUD重构一下作为组件化集成到asp.net ...

随机推荐

  1. JAVA多线程之CountDownLatch

    前序: 上周测试给开发的同事所开发的模块提出了一个bug,并且还是偶现. 经过仔细查看代码,发现是在业务中启用了多线程,2个线程同时跑,但是新启动的2个线程必须保证一个完成之后另一个再继续运行,才能消 ...

  2. Logger之Logger.getLogger(CLass)技巧代替system.out.print

    ---恢复内容开始--- 尊重原创:http://www.cnblogs.com/zxf330301/p/5876117.html 之前一直在使用System.out.println()来调试.但是用 ...

  3. the method of validate slow

  4. ceph-deploy出错UnableToResolveError Unable to resolve host

    背景 ps:在本文中,假设我系统的hostname为node1. 使用ceph-deploy命令搭建Ceph集群,执行ceph new node1时,出现如下错误: [node1][INFO ] Ru ...

  5. 20170723-Ioc与AOP

    Ioc与AOP 功能.语法.分类.原理.例子.补充(AOP-Ioc-DI) 1.AOP: ①功能体现:是拦截,过滤器: ②相关语法:借助特性语法作为切入点: ③实现方式分类:动态代理+静态织入: ④实 ...

  6. Unity 小笔记

    1,Time.deltatime放在Update和fixedupdate中得到的值是不一样的.还以为是通过两个值来获取. 2,VR中绘制射线可以使用LineRender. 3,Unity中判断一个东西 ...

  7. UML学习网址列表

    在线绘图工具ProcessOn:https://www.processon.com/support#mind-format 鲁棒图实例:http://blog.csdn.net/joeyon1985/ ...

  8. Insert Sort Singly List

    对单链表插入排序,给出个单链表的head节点:返回排完序的head节点: 首先数据结构中习惯了以数组为参数排序,瞬间想到是遍历单链表存入arraylist中,再进行insert sort,(O(n** ...

  9. JavaScript String(字符串对象)

    String 对字符串的支持 String.charAt( n ) 返回字符串中的第n个字符 n 是下标 String.charCodeAt( ) 返回字符串中的第n个字符的代码 String.con ...

  10. 针对php脚本文件执行锁定的代码,避免脚本在同一时间重复运行

    <?php//针对php脚本文件执行锁定的代码,避免脚本在同一时间重复运行,http://ken.01h.net/define('PHP_LOCK_FILE', dirname(__FILE__ ...