来自ControllerContext的ActionDescriptor

15

如果我只能访问ControllerContext而不能访问Action____Contexts,那么获取当前正在执行的ActionDescriptor的最佳方法是什么?

到目前为止,我找到的唯一方法是:

new ReflectedControllerDescriptor(context.Controller.GetType())
    .FindAction(context, context.RouteData.GetRequiredString("action"));

这是最佳方法吗?

类名为ReflectedControllerDescriptor的事实使我想知道执行此操作是否有很大的代价,因为它将在每个页面请求上执行?相关的是,此类是否在内部缓存,还是我应该显式地缓存ReflectedControllerDescriptors


深入研究MVC源代码后,我发现这是最优的方法,而无需复制执行你已经在做的所有方法。然而,我认为你可以缓存找到的操作,以便后续操作更加高效。 - Buildstarted
此外,ReflectedControllerDescriptor使用反射获取操作,因为它不仅查看方法,还查看附加到方法的属性。(ReflectedControllerDescriptor还缓存结果) - Buildstarted
@BuildStarted 所以 ReflectedControllerDescriptor 内部的反射使用确实被缓存了,但可以说我也可以缓存对 FindAction 的调用吗? - Chris Marisic
是的,你可以这样做。即使使用缓存操作,在ReflectedControllerDescriptor中仍需要对属性进行一些额外的处理,但似乎并不会占用太多的处理资源。 - Buildstarted
这帮助我从IExceptionFilter获取ActionDescriptor,从中可以获得ControllerContext,谢谢。 - Virus721
1个回答

9

通过对MVC源代码的一些深入研究,我发现这是最优方式,而不需要复制已有的方法来实现你正在进行的操作。然而,我认为可以缓存找到的操作,以便后续调用更具性能。

在内部,ReflectedControllerDescriptor 也会缓存结果,但每次都会检查所有属性,似乎有点开销。它似乎是为 HttpPostAttribute 等内容而设计的。

我的建议是坚持使用当前的方法,而不是自己进行缓存。如果由于某种原因,底层方法的工作方式发生了变化,则你已经是最新的,并且无需担心更改缓存项存储方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接