OData WebAPI实践-与ABP vNext集成
本文属于 OData 系列文章
ABP 是一个流行的 ASP. NET 开发框架,旧版的的 ABP 已经能够非常好的支持了 OData ,并提供了对应的 OData 包。
ABP vNext 是一个重新设计的,面向微服务的框架,提供了一些非常有用的特性,包括分页查询等但是它并不能原生支持 OData ,我们需要自行实现。
本文的实现方式本质上为
side by side方式,由于 ABP vNext 官方没有对应的设计,所以你依然需要自己编写控制器。
本文使用 ABP CLI 6.0.3 生成的 ABP vNext 项目、Microsoft.AspNetCore.OData 8.1.2
原理
ABP vNext 有自动生成 Controller 的机制,我们的 ApplicationService,它会帮我们自动生成对应的终结点,并对外提供服务。这个过程是由 ABP 控制的,我们能修改的内容非常有限。
// TodoAppHttpApiHostModule.cs
private void ConfigureConventionalControllers()
{
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ConventionalControllers.Create(typeof(TodoAppApplicationModule).Assembly, options =>
{
//// 移除自动生成的控制器
//options.ControllerTypes.Remove(typeof(TodoAppController));
//options.RootPath = "abp";
//// 添加手动实现的控制器
//options.ControllerTypes.Add(typeof(TodoAppImplController));
});
});
}
它依照惯例生成,我们可以对类型进行增加或者减少,但是不能控制生成的行为。而 OData 的控制器,需要我们从 ODataController 继承,或者使用 [EnableQuery],因此我们需要阻止自动生成控制器,自己实现对应的逻辑。
有了对应的控制器,就需要在应用程序模块中配置 OData 的路由、EDM 等信息,并且不要和原有的控制器路由冲突。
实现
首先禁用自动生成控制器功能。
//TodoAppService.cs
[RemoteService(false)]
public class TodoAppService : ApplicationService, ITodoAppService
{
private readonly IRepository<TodoItem, Guid> _todoItemRepository;
public TodoAppService(IRepository<TodoItem, Guid> todoItemRepository)
{
_todoItemRepository = todoItemRepository;
}
public async Task<IQueryable<TodoItemDto>> GetListAsync()
{
var items = await _todoItemRepository.GetQueryableAsync();
return items
.Select(item => new TodoItemDto
{
Id = item.Id,
Text = item.Text
})
}
}
将应用服务打上 [RemoteService(false)] 标记,服务就不会自动生成控制器。接下来在 HttpApi 项目中新建一个与服务同名的控制器,由于 ABP 项目自动生成了控制器抽象类模板,我们继承并实现它即可。
/* Inherit your controllers from this class.
*/
public abstract class TodoAppController : AbpControllerBase
{
protected TodoAppController()
{
LocalizationResource = typeof(TodoAppResource);
}
}
public class TodoController : TodoAppController
{
private readonly ITodoAppService todoAppService;
public TodoController(ITodoAppService todoAppService)
:base()
{
this.todoAppService = todoAppService;
}
[EnableQuery]
public async Task<IEnumerable<TodoItemDto>> GetAsync()
{
var result = await todoAppService.GetListAsync();
return result.AsQueryable();
}
}
注入对应的服务,实现自己的逻辑,如果需要利用 EF Core 的查询功能,请使用 IQueryable 传递数据到控制器层。然后配置 OData :
//TodoAppHttpApiHostModule.cs
private IEdmModel GetEdmModels()
{
var builder = new ODataConventionModelBuilder();
var device = builder.EntitySet<TodoItemDto>("Todo").EntityType.HasKey(w => w.Id);
return builder.GetEdmModel();
}
记得在 PreConfigureServices 中加上调用。
//TodoAppHttpApiHostModule.cs
public override void PreConfigureServices(ServiceConfigurationContext context)
{
PreConfigure<OpenIddictBuilder>(builder =>
{
builder.AddValidation(options =>
{
options.AddAudiences("TodoApp");
options.UseLocalServer();
options.UseAspNetCore();
});
});
// 加上这个调用
PreConfigure<IMvcBuilder>(builder =>
{
builder.AddOData(opt =>
{
opt.RouteOptions.EnablePropertyNameCaseInsensitive = true;
opt.RouteOptions.EnableQualifiedOperationCall = false;
opt.Expand().Filter().Count().OrderBy().Filter().SetMaxTop(30);
opt.AddRouteComponents("api/app/", GetEdmModels());
});
});
}
运行后,大功告成:
![[Pasted image 20230512173232.png]]
总结
本文实现了 OData 在 ABP vNext 中的使用。请注意,本方案只是一个 Demo,应用到生产前请自行评估风险,期待 ABP 团队在未来正式支持 OData 吧。本文的完整代码在 github,运行前可能需要先执行数据库初始化。
OData WebAPI实践-与ABP vNext集成的更多相关文章
- [Abp vNext微服务实践] - 前后端分类
一.前景 abp vNext是ABP 开源 Web应用程序框架,是abp的新一代开源web框架.框架完美的集成.net core.identity server4等开源框架,适用于构建web应用程序和 ...
- Abp vnext EFCore 实现动态上下文DbSet踩坑记
背景 我们在用EFCore框架操作数据库的时候,我们会遇到在 xxDbContext 中要写大量的上下文 DbSet<>; 那我们表少还可以接受,表多的时候每张表都要写一个DbSet, 大 ...
- ABP vnext模块化架构的最佳实践的实现
在上一篇文章<手把手教你用Abp vnext构建API接口服务>中,我们用ABP vnext实现了WebAPI接口服务,但是并非ABP模块化架构的最佳实践.我本身也在学习ABP,我认为AB ...
- [Abp vNext微服务实践] - 框架分析
一.简介 abp vNext新框架的热度一直都很高,于是最近上手将vNext的微服务Demo做了一番研究.我的体验是,vNext的微服务架构确实比较成熟,但是十分难以上手,对于没有微服务开发经验的.n ...
- [Abp vNext微服务实践] - 文章目录
简介 ABP vNext是volosoft的新一代框架,ABP(vNext)完全使用.NET CORE和DDD(领域驱动)打造,目前GitHub已有6K+次提交,发布版本超过40次,Nuget包下载量 ...
- [Abp vNext微服务实践] - 服务通讯
简介 服务通讯是微服务架构中必不可少的功能,服务通讯的效率决定了微服务架构的优略.常用的微服务通讯策略有两种,分别是rpc.http,其中rpc以gRpc框架为代表使用者最多.abp vNext微服务 ...
- [Abp vNext微服务实践] - 启动流程
前几篇分别介绍了abp vNext微服务框架和微服务CI/CD环境搭建,本篇开始介绍vNext微服务框架的开发环境搭建. 环境准备 官方介绍的系统架构图如下: 上图中身份服务和网关服务已经集成在系统中 ...
- [Abp vNext 源码分析] - 14. EntityFramework Core 的集成
一.简要介绍 在以前的文章里面,我们介绍了 ABP vNext 在 DDD 模块定义了仓储的接口定义和基本实现.本章将会介绍,ABP vNext 是如何将 EntityFramework Core 框 ...
- ABP VNext实践之搭建可用于生产的IdentityServer4
一.前言 用了半年多的abp vnext,在开发的效果还是非常的好,可以说节省了很多时间,像事件总线.模块化开发.动态API进行远程调用.自动API控制器等等,一整套的规范,让开发人员更方便的集成,提 ...
- Abp Vnext Blazor替换UI组件 集成BootstrapBlazor(详细过程)
Abp Vnext自带的blazor项目使用的是 Blazorise,但是试用后发现不支持多标签.于是想替换为BootstrapBlazor. 过程比较复杂,本人已经把模块写好了只需要替换掉即可. 点 ...
随机推荐
- 【故障公告】cc攻击又来了,雪上加霜的三月
非常非常抱歉!今天 21:20-22:10 左右,肆无忌惮的 cc 攻击又来了,蓄意攻击者很厉害,躲过阿里云云盾的黑洞机制,轻松击垮园子的博客站点,又给大家带来了很大的麻烦,请大家谅解! 今年3月是园 ...
- 详解AQS的7个同步组件
摘要:AQS的全称为Abstract Queued Synchronizer,是在J.U.C(java.util.concurrent)下子包中的类. 本文分享自华为云社区<[高并发]AQS案例 ...
- Android Studio报错--Build failed with an exception.
错误描述 在代码写好之后,点击运行,会爆出这样的错误,查看日志,发现是Manifest.xml文件爆出来的错误 具体解决 我的错误没有别的版本那么麻烦,就是我建立了Empty Activity之后,我 ...
- MySQL学习(一)大纲
1.逻辑架构 参考博客:https://blog.csdn.net/fuzhongmin05/article/details/70904190 最上层为客户端层,并非mysql独有,诸如:连接处理.授 ...
- CF916E 解题报告
被这道题搞了一个晚上,还好搞出来了qwq 令人耳目一新的阅读体验 题目简述 翻译已经很简单了. 前置知识 DFS序,LCA,线段树,不需要标签中的树剖! DFS序更新信息及判断祖先 如果你还不知道DF ...
- Freemon停止提供免费域名注册了
前言 freemon是一家国外的域名注册商,提供很多顶级的域名注册,最棒的是它还提供了五个免费的顶级一级域名注册分别有:tk.cf.ml.ga.gq,而且据我所知是不限量注册,最高一年使用期,可以免费 ...
- GaussDB(DWS)运维:导致SQL执行不下推的改写方案
摘要:本文就针对因USING子句的书写方式可能导致MERGE INTO语句的执行不下推的场景,对USING子句的SQL语句进行改写一遍,整个SQL语句可以下推. 本文分享自华为云社区<Gauss ...
- 发布新版博客备份功能:生成 sqlite 数据库文件,vscode 插件可查看
大家好,最近我们重新开发了园子的博客备份功能,今天发布第一个预览版,欢迎大家试用. 点击博客后台侧边栏的博客备份进入新版博客备份: 点击创建备份按钮创建博客备份任务(目前每天只能创建一次备份),待备份 ...
- 剑指 offer 第 4 天
第 4 天 查找算法(简单) 剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但 ...
- JSF预热功能在企业前台研发部的实践与探索
作者:京东零售 李孟东 00 导读 企业前台研发部包含了企业业务大部分的对外前台系统,其中京东VOP平台(开放平台)适合于自建内网采购商城平台的企业客户. 京东为这类客户专门开发API接口,对接到客户 ...