什么时候需要 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 可能具有的新功能。
使用遗留应用程序时,我注意到 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 可能具有的新功能。