首页 > 其他分享 >OData WebAPI实践-与ABP vNext集成

OData WebAPI实践-与ABP vNext集成

时间:2023-05-16 12:46:46浏览次数:48  
标签:WebAPI vNext 控制器 OData options ABP public

本文属于 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,运行前可能需要先执行数据库初始化。

标签:WebAPI,vNext,控制器,OData,options,ABP,public
From: https://www.cnblogs.com/podolski/p/17405018.html

相关文章

  • abp automapper setting
    @@abpautomappersettinghttps://docs.abp.io/zh-Hans/abp/latest/Object-To-Object-Mapping对象到对象映射将对象映射到另一个对象是常用并且繁琐重复的工作,大部分情况下两个类都具有相同或相似的属性.例如下面的 应用服务方法:publicclassUserAppService:Applicati......
  • OData WebAPI实践-兼容OData集合响应
    本文属于OData系列文章引言OData是一个开放标准,已经在oasis组织标准化,因此我们可以在标准的官网查询到OData的标准请求与返回形式:ODataJSONFormatVersion4.01(oasis-open.org)针对不同的数据类型,输出返回的格式也不尽相同,涉及的内容非常多。日常使用OData的过程......
  • ABP Suite模块项目中设置菜单及其多语言
    1、Blazor的菜单构造的类ABPSuite自动生成的是这样:2、从Study.Trade.Web的Menus下拷贝内容过来后3、TradeMenus中增加一个常量4、启动程序单击Trade后,能看到子菜单单击“CustomerOrders”,页面正确导航了:5、翻译菜单项语言的资源文件,都在Domain.Shared项目的Localization的子文件......
  • 一对多数据的多选筛选([EF,ABP]但是sql思路通用)
    一对多数据的多选筛选([EF,ABP]但是sql思路通用)标题起的并不是特别准确,但是现在又没有更加准确的描述,暂时这样了业务需求:数据格式为一条数据,对应多条二级数据,暂时表示为主信息为“书”,二级为他的各种描述信息:1.社会科学-学术类-自定义文字,2.科技信息-学术类-自定义文字,然后搜索......
  • Labview工业以太网Ethernetip TCP通讯培训支持所有Ethernetip协议的设备和模块常用罗
    Labview工业以太网EthernetipTCP通讯培训支持所有Ethernetip协议的设备和模块常用罗克韦尔ABPLC,欧姆龙NXNJPLC数据标签通讯让你从原理上学会从此定值自己的通讯协议ID:46399669472727510......
  • ABP - 初识 ABP
    ABP框架ABP是用于创建现代化Web应用程序的完整体系结构和强大的基础架构,以模块化的方式进行开发,所有模块以nuget包的方式提供,开箱即用,遵循最佳实践和约定,提供SOLID开发经验。缩写英文中文SRPTheSingleResponsibilityPrinciple单一职责元素OCPTheOpenClosed......
  • EntityFramework Core 6.0 MySql WebApi
    Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.DesignPomelo.EntityFrameworkCore.MySqlMicrosoft.EntityFrameworkCore.Tools-----------------------------------------------------------------------------------------------------------------------......
  • c# 调用webapi的几种方式
     HttpHelper帮助类publicstaticclassHttphelper{//Post请求publicstaticstringPostResponse(stringurl,stringpostData,outstringstatusCode){stringresult=string.Empty;//设置Http的正文......
  • OData WebAPI实践-OData与EDM
    本文属于OData系列引言在OData中,EDM(EntityDataModel)代表“实体数据模型”,它是一种用于表示WebAPI中的结构化数据的格式。EDM定义了可以由OData服务公开的数据类型、实体和关系。EDM也提供了一些规则来描述数据模型中的实体之间的关系,例如继承、关联和复合类型。E......
  • ABP开发需要用到的命令
    #0、命令行在哪里执行?在VisualStudio的“解决方案资源管理器”的解决方案或者项目上点鼠标右键,选择“在终端中打开”。#1、安装abp官网文档地址:https://docs.abp.io/en/abp/latest/CLIABPCLI是一个dotnetglobaltool.使用命令行窗口安装:~~~dotnettoolinstall-g......