Asp.Net Core中利用ModelConvention实现过滤器隔离

0 下载量 201 浏览量 更新于2024-08-04 收藏 173KB DOCX 举报
本文档主要讨论了如何在ASP.NET Core中使用ModelConvention来实现全局过滤器的隔离,特别是在同时包含MVC和WebAPI的应用中,如何避免全局过滤器对MVC部分造成不必要的影响。 在ASP.NET Core中,我们通常通过在Startup.cs文件的服务配置中添加过滤器(Filters)来实现全局过滤器的注册,如以下代码所示: ```csharp services.AddMvc(options => { options.Filters.Add(typeof(AccessControlFilter)); }); ``` 然而,这种方式会将该过滤器应用到所有的控制器,包括MVC控制器和WebAPI控制器。为了避免在MVC控制器上不必要地应用WebAPI的接口验证过滤器,我们需要一种更精确的方法来控制过滤器的范围。这时,ModelConvention就派上了用场。 ModelConvention(模型约定)允许开发者自定义MVC应用程序模型的行为,通过创建自己的约定并将其应用到全局或者作为特性(Attributes)。ASP.NET Core MVC的应用程序模型(ApplicationModel)包含了关于控制器、动作、参数和路由等组件的信息。默认情况下,MVC遵循一定的约定来识别控制器和动作,但我们可以利用ModelConvention来修改这些约定,以适应特定应用的需求。 要使用ModelConvention实现过滤器的隔离,首先我们需要创建一个自定义的ModelConvention类,继承自`Microsoft.AspNetCore.Mvc.ApplicationModels.IApplicationModelConvention`接口,并在其`Apply`方法中添加针对WebAPI控制器的过滤器逻辑。例如: ```csharp public class ApiFilterConvention : IApplicationModelConvention { public void Apply(ApplicationModel application) { foreach (var controller in application.Controllers) { if (controller.ControllerType.GetInterfaces() .Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IHttpController))) { controller.Filters.Add(typeof(AccessControlFilter)); } } } } ``` 在这个例子中,我们检查每个控制器是否实现了`IHttpController`接口,这是WebAPI控制器的一个标志。如果实现了,我们就将`AccessControlFilter`添加到该控制器的过滤器列表中。 然后,我们需要在Startup.cs的ConfigureServices方法中注册这个自定义的ModelConvention: ```csharp services.AddMvc(options => { // 其他配置... }) .AddApplicationPart(typeof(ApiFilterConvention).Assembly) .AddMvcOptions(options => { options.Conventions.Add(new ApiFilterConvention()); }); ``` 通过以上步骤,我们成功地实现了过滤器的隔离,只在WebAPI控制器上应用了`AccessControlFilter`,而不会影响MVC控制器。 ModelConvention提供了一种灵活且强大的方式来定制ASP.NET Core MVC的行为,尤其在处理全局过滤器时,能够根据具体需求精细化地控制过滤器的范围,避免了不必要的干扰。在多框架集成或有特殊需求的应用中,ModelConvention是一个非常有用的工具。
2023-06-10 上传