從何說起
這來自于我把項目遷移到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); }}
新聞熱點
疑難解答
圖片精選