使用遗留应用程序,我注意到两种不同的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...
}
}
是否有理由包含/排除基本呼叫?
答案 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
方法是空的,那么无论你是否调用它都没有区别。如果继承下一层类(例如SpecialFilter
:BaseFilter
:ActionFilter
)会有所不同 - 在这种情况下,不调用基类将产生显着差异(这可能是有意的,希望它将在代码中发表评论。)
在我工作的地方,除非在文档中明确禁止,否则调用基本实现是自定义的。没有调用基类的情况通常会添加注释,理由为何。