什么时候需要 include/exclude 对 MVC 动作过滤器的基本调用?

When is it necessary to include/exclude the base call for MVC action filters?

使用遗留应用程序时,我注意到 MVC 过滤器的两种不同实现遵循以下模式:

示例 1:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class TestFilterAttribute : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
    {
        // Code here...
        base.OnActionExecuted(filterContext);
    }

    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Code here...
        base.OnActionExecuting(filterContext);
    }
}

示例 2:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class TestFilterAttribute : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
    {
        // Code here...
    }

    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Code here...
    }
}

是否有理由 include/exclude 碱基检出?

C# 没有可以表达的概念"derived class must/must not call base class implementations"。有 abastract 在层次结构的第一层有点帮助说 "derived must provide implementation and must not call base",但对于可选方法(如操作过滤器)有缺点。

因此,当 should/must/must 不调用基础实现时,无法做出一般决定。

如果OnXxxx方法的ActionFilters基础实现是空的,那么调用与否没有区别。如果您继承下一层 classes(如 SpecialFilter: BaseFilter : ActionFilter),这将有所不同 - 在这种情况下,不调用 base class 将使显着差异(这可能是故意的,希望它会在代码中有注释)。

在我工作的地方,习惯调用基本实现,除非在文档中明确禁止。不调用基 class 的情况通常会添加注释并说明原因。

在这种情况下,调用 base 方法没有意义,因为您从 abstract class 派生,默认实现为空(来自反编译源):

/// <summary>
/// Occurs before the action method is invoked.
/// </summary>
/// <param name="actionContext">The action context.</param>
public virtual void OnActionExecuting(HttpActionContext actionContext)
{
}

/// <summary>
/// Occurs after the action method is invoked.
/// </summary>
/// <param name="actionExecutedContext">The action executed context.</param>
public virtual void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
}

但是,如果有一天 ActionFilterAttribute 的实现发生变化,您可能会从调用基本方法中受益。但这只是假设,这取决于您,因为这取决于此 class 可能具有的新功能。