OData WebAPI實踐-與ABP vNext集成

来源:https://www.cnblogs.com/podolski/archive/2023/05/16/17405018.html
-Advertisement-
Play Games

本文屬於 OData 系列文章 ABP 是一個流行的 ASP. NET 開發框架,舊版的的 ABP 已經能夠非常好的支持了 OData ,並提供了對應的 OData 包。 ABP vNext 是一個重新設計的,面向微服務的框架,提供了一些非常有用的特性,包括分頁查詢等但是它並不能原生支持 OData ...


本文屬於 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());
            });
        });
    }

運行後,大功告成:

image

總結

本文實現了 OData 在 ABP vNext 中的使用。請註意,本方案只是一個 Demo,應用到生產前請自行評估風險,期待 ABP 團隊在未來正式支持 OData 吧。本文的完整代碼在 github,運行前可能需要先執行資料庫初始化。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、jieba庫是什麼? Python的jieba庫是一個中文分詞工具,它可以將一段中文文本分割成一個一個的詞語,方便後續的自然語言處理任務,如文本分類、情感分析等。jieba庫使用了基於首碼詞典的分詞方法,能夠處理中文的各種複雜情況,如歧義詞、新詞等。它還提供了多種分詞模式,如精確模式、全模式、搜 ...
  • comparator比較器 ​ Comparator不同於Comparable,使用更加的靈活,可以在不同場景下使用比較器,實際開發中,更推薦comparator比較器 // 新建一個學生類,作為慄子 public class Student { private int sno; private f ...
  • 下麵這段代碼,IDE里正常顯示。不過,在build時,會報錯。 interface Doable { Integer getCode(); } @lombok.Getter class DerivedClass implements Doable { int code; } 錯誤信息: Error: ...
  • 作者:京東科技 李玉亮 目錄指引 限流場景 軟體系統中一般有兩種場景會用到限流: •場景一、高併發的用戶端場景。 尤其是C端系統,經常面對海量用戶請求,如不做限流,遇到瞬間高併發的場景,則可能壓垮系統。 •場景二、內部交易處理場景。 如某類交易任務處理時有速率要求,再如上下游調用時下游對上游有速率要 ...
  • 最近因為陽了的緣故一直躺在床上。今天終於從床上爬起來了。不是因為好透了,而是因為我收到了申請Copilot Chat preview 許可權通過的郵件。實在忍不住,於是起床開電腦在咳嗽聲中進行了一番體驗。 如何申請 https://github.com/github-copilot/chat_wait ...
  • 一、系統特點 提高工作效率 避免人工出錯 適用於各種行業的稱重計價需求,如採購稱重、加工包裝稱重、零售稱重等場景。 二、功能介紹 1.稱重計價 2.列印小票/三聯單 3.商品管理 4.數據統計 5.歷史數據 三、支持型號: 耀華XK3190-A9 耀華XK3190-A12E 耀華XK3190-A27 ...
  • Abp是一個基於模塊化開發的應用程式框架,提供了模塊化基礎的架構和模塊化載入的引擎。 理解模塊 一個模塊是對一個功能點的封裝,可以獨立成為一個包,實現了松耦合的代碼組織方式。Abp框架的基本思想就是模塊開發,模塊就想樂高中的一塊塊積木,在項目中將不同功能點的模塊引用進來,就像搭積木一樣構建成一個成品 ...
  • 前言 接上一篇Linux系統下創建dotnet項目,這一篇我們聊聊.NET6環境下dotnet項目連接資料庫的方式方法,包括資料庫字元串該如何配置。看了很多博主寫的文章,連接資料庫字元串配置的方式和位置五花八門,這篇文章給大家介紹一下連接資料庫字元串的配置方式方法,順便介紹下一個新創建的dotnet ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...