主頁 > .NET開發 > OData WebAPI實踐-與ABP vNext集成

OData WebAPI實踐-與ABP vNext集成

2023-05-16 15:33:04 .NET開發

本文屬于 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,運行前可能需要先執行資料庫初始化,

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/552596.html

標籤:ASP.NET

上一篇:VB.NET 截取字串

下一篇:返回列表

標籤雲
其他(159130) Python(38137) JavaScript(25431) Java(18044) C(15226) 區塊鏈(8267) C#(7972) AI(7469) 爪哇(7425) MySQL(7191) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4572) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1973) 功能(1967) Web開發(1951) HtmlCss(1937) python-3.x(1918) C++(1917) 弹簧靴(1913) xml(1889) PostgreSQL(1877) .NETCore(1860) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • OData WebAPI實踐-與ABP vNext集成

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

    uj5u.com 2023-05-16 15:33:04 more
  • VB.NET 截取字串

    在VB.NET中,您可以使用Substring方法或Split方法來截取字串。 Substring方法允許您從字串中提取一個子字串,該子字串從指定的起始索引開始,并繼續到字串的末尾或指定的長度。以下是使用Substring方法截取字串的示例: Dim str As String = "H ......

    uj5u.com 2023-05-16 07:41:42 more
  • 修改NuGet包默認存放位置

    默認情況下,NuGet下載的包存放在系統盤(C盤中),這樣一來,時間長了下載的包越多,C盤占用的空間也就越多。 🍕1、問題描述 默認情況下,NuGet下載的包存放在系統盤(C盤中,一般在路徑C:\Users\用戶.nuget\packages下),這樣一來,時間長了下載的包越多,C盤占用的空間也就 ......

    uj5u.com 2023-05-16 07:36:00 more
  • 基于DevExpress的GridControl實作的一些界面處理功能

    <a href="https://www.cnblogs.com/wuhuacong/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u8867.png" alt="" /></a>...

    uj5u.com 2023-05-16 07:28:49 more
  • 【開源游戲】Legends-Of-Heroes 基于ET 7.2的雙端C#(.net7 + Uni

    <a href="https://www.cnblogs.com/flamesky/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/510084/20131103164042.png" alt="" /><...

    uj5u.com 2023-05-10 10:20:23 more
  • 基礎-字串駐留池

    <a href="https://www.cnblogs.com/netcore5/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/1920368/20200602132718.png" alt="" />&l...

    uj5u.com 2023-05-10 10:20:13 more
  • WEB API .NET環境發布

    <a href="https://www.cnblogs.com/donywc/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2800973/20220609165707.png" alt="" /><...

    uj5u.com 2023-05-10 10:19:39 more
  • C#自定義例外就這么簡單

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-05-10 10:18:55 more
  • 聊一聊 dotnet-trace 調查 lock鎖競爭

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-05-10 10:18:41 more
  • 開源.NetCore通用工具庫Xmtool使用連載 - 散列演算法篇

    【Github原始碼】 《上一篇》詳細介紹了Xmtool工具庫中的加解密類別庫,今天我們繼續為大家介紹其中的散列演算法類別庫。 散列演算法在某些特殊場景也可以當做加密方法使用;其特點是不可逆,同一內容每次散列值絕對一致,所以也可用作對資料內容是否被篡改的校驗方法;或者其他需要唯一性編碼的場景;本類別庫提供了MD ......

    uj5u.com 2023-05-10 10:18:23 more