你可以使用 定制约定 为此,它允许定制 应用模型 。使用约定允许您使用所述约定的全局注册或通过使用操作上的属性等来自动为项目中的每个操作添加过滤器。
以下是针对您的目的的自定义约定的示例实现:
public class SomeActionModelConvention : IActionModelConvention { public void Apply(ActionModel model) { model.Filters.Add(new AuthorizeFilter(model.ActionName)); } }
在这个例子中,我们实现 IActionModelConvention ,它定义了一个 Apply MVC框架在初始化时调用的方法。在上面的实现中,我们只是添加一个 AuthorizeFilter 到使用操作名称作为策略名称的模型。
IActionModelConvention
Apply
AuthorizeFilter
要注册约定,请通过添加它 MvcOptions 在 Startup.ConfigureServices 。例如。:
MvcOptions
Startup.ConfigureServices
serices.AddMvc(options => options.Conventions.Add(new SomeActionModelConvention()));
正如我上面提到的,可以使用属性注册它,但是在这种情况下没有多大意义,因为你必须将属性添加到动作本身,这会破坏高级别的目的这个惯例。
但是,如果要将其作为属性应用于 调节器 级别,以便您可以更具选择性,您可以实现自定义 调节器 做一些非常相似的约定。这是一个示例:
public class SomeControllerModelConvention : Attribute, IControllerModelConvention { public void Apply(ControllerModel model) { foreach (var actionModel in model.Actions) actionModel.Filters.Add(new AuthorizeFilter(actionModel.ActionName)); } }
这非常相似 SomeActionModelConvention ,除了这三个差异:
SomeActionModelConvention
ControllerModel
Attribute
使用这种方法时,惯例就是这样 不 需要加入 Startup.ConfigureServices - 相反,它可以作为属性添加。例如。:
[Route("api/[controller]")] [ApiController] [SomeControllerModelConvention] public class UniversityController : ControllerBase ...
最后,如果要将约定应用于控制器但使用代码执行此操作,则可以在其中注册约定 Startup.ConfigureServices (和。一样 SomeActionModelConvention 方法)然后自定义执行 Apply 仅根据您自己的逻辑添加过滤器。我不会详细说明,因为我已经持续了足够长的时间。