什么时候需要包含/排除MVC动作过滤器的基本调用?

时间:2015-03-10 22:26:25

标签: c# .net asp.net-mvc-4

使用遗留应用程序,我注意到两种不同的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...
    }
}

是否有理由包含/排除基本呼叫?

2 个答案:

答案 0 :(得分:2)

在这种情况下,调用base方法是没有意义的,因为你派生出一个abstract类,默认实现为空(来自反编译源):

/// <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更改的实施,您可以从调用基本方法中受益。但这只是假设,它取决于你,因为它取决于这个类可能有什么新功能。

答案 1 :(得分:1)

C#没有让人们表达“派生类必须/不能调用基类实现”的概念。有abastract在第一级层次结构上有点帮助,说“派生必须提供实现,不得调用基础”,但这对于可选方法(如动作过滤器)有缺点。

因此,当一个人/必须/必须/不能调用基础实现时,不可能作出一般性决定。

如果ActionFilters基本实现OnXxxx方法是空的,那么无论你是否调用它都没有区别。如果继承下一层类(例如SpecialFilterBaseFilterActionFilter)会有所不同 - 在这种情况下,不调用基类将产生显着差异(这可能是有意的,希望它将在代码中发表评论。)

在我工作的地方,除非在文档中明确禁止,否则调用基本实现是自定义的。没有调用基类的情况通常会添加注释,理由为何。