国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

在Asp.Net Core中使用ModelConvention實現全局過濾器隔離

2024-07-10 12:49:41
字體:
來源:轉載
供稿:網友

從何說起

這來自于我把項目遷移到Asp.Net Core的過程中碰到一個問題。在一個web程序中同時包含了MVC和WebAPI,現在需要給WebAPI部分單獨添加一個接口驗證過濾器 IActionFilter ,常規做法一般是寫好過濾器后給需要的控制器掛上這個標簽,高級點的做法是注冊一個全局過濾器,這樣可以避免每次手動添加同時代碼也更好管理。注冊全局過濾器的方式為:

services.AddMvc(options => {  options.Filters.Add(typeof(AccessControlFilter)); });

但這樣做會帶來一個問題,那就是MVC部分控制器也會受影響,雖然可以在過濾器中進行一些判斷來區分哪些是MVC Controller哪些是API Controller,但是平白無故給MVC增加這么一個沒用的Filter,反正我是不能忍,所以尋找有沒有更好的辦法來實現這個功能。

于是ModelConvention(可以翻譯為模型約定)閃亮登場。

先認識下ApplicationModel

看一下官方文檔是怎么描述應用程序模型(ApplicationModel)的:

ASP.NET Core MVC defines an application model representing the components of an MVC app. You can read and manipulate this model to modify how MVC elements behave. By default, MVC follows certain conventions to determine which classes are considered to be controllers, which methods on those classes are actions, and how parameters and routing behave. You can customize this behavior to suit your app's needs by creating your own conventions and applying them globally or as attributes.

簡單一點說,ApplicationModel描述了MVC應用中的各種對象和行為,這些內容包含Application、Controller、Action、Parameter、Router、Page、Property、Filter等等,而Asp.Net Core框架本身內置一套規則(Convention)用來處理這些模型,同時也提供了接口給我們自定義約定來擴展模型以實現更符合需要的應用。

和應用程序模型有關的類都定義在命名空間 Microsoft.AspNetCore.Mvc.ApplicationModels 中,這些模型通過 IApplicationModelProvider 構建出來,Asp.Net Core框架提供的默認Provider是 DefaultApplicationModelProvider 。我們可以編輯這些模型,從而更改它的表現行為,這就要借助它的ModelConvention來實現。

ModelConvention

ModelConvention定義了操作模型的入口,又或者說是一種契約,通過它我們可以對模型進行修改,常用的Convention包括:

IApplicationModelConvention IControllerModelConvention IActionModelConvention IParameterModelConvention IPageRouteModelConvention

這些接口提供了一個共同的方法 Apply ,方法參數是各自的應用程序模型,以 IControllerModelConvention 為例看一下它的定義:

namespace Microsoft.AspNetCore.Mvc.ApplicationModels{ // // 摘要: //  Allows customization of the Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerModel. // // 言論: //  To use this interface, create an System.Attribute class which implements the //  interface and place it on a controller class. Microsoft.AspNetCore.Mvc.ApplicationModels.IControllerModelConvention //  customizations run after Microsoft.AspNetCore.Mvc.ApplicationModels.IApplicationModelConvention //  customizations and before Microsoft.AspNetCore.Mvc.ApplicationModels.IActionModelConvention //  customizations. public interface IControllerModelConvention {  //  // 摘要:  //  Called to apply the convention to the Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerModel.  //  // 參數:  // controller:  //  The Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerModel.  void Apply(ControllerModel controller); }}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宜川县| 始兴县| 九龙坡区| 台前县| 苏尼特左旗| 阳西县| 浦北县| 井研县| 且末县| 兴业县| 宜昌市| 黎城县| 商城县| 无极县| 辰溪县| 龙南县| 福清市| 邓州市| 丁青县| 巴东县| 玛曲县| 偃师市| 措勤县| 黔东| 沽源县| 涟水县| 霍林郭勒市| 彭阳县| 洮南市| 南华县| 富顺县| 济源市| 克什克腾旗| 普洱| 海城市| 桂林市| 哈巴河县| 集贤县| 郯城县| 静安区| 龙里县|