2012-05-30 46 views
14

鉴于我只能访问ControllerContext而不是Action____Contexts什么是获取当前执行的ActionDescriptor的最佳方式?来自ControllerContext的ActionDescriptor

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

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

这是最佳的方法是什么?

类名为ReflectedControllerDescriptor这个事实让我不知道这个操作是否有很高的成本,因为它会在每个页面请求中执行?与此相关的是这个类内部缓存,或者我应该明确缓存ReflectedControllerDescriptors

+0

做一些挖掘MVC源代码,这几乎是最优化的方式,而不需要复制所需的所有方法来完成您已经在做的事情。但是,我不明白为什么您不能缓存找到的操作,以便后续操作更具性能。 – Buildstarted

+0

此外,ReflectedControllerDescriptor确实使用反射来获取Actions,因为它不仅查看方法,而且还查看附加到方法的属性。 (ReflectedControllerDescriptor也会缓存结果) – Buildstarted

+0

@BuildStarted所以'ReflectedControllerDescriptor'里面的反射用法确实被缓存了,但是可以说我可以将我的调用缓存到FindAction? –

回答

9

做一些挖掘MVC源代码,这是非常优化的方式,而不需要复制所有你需要做的事情。但是,我不明白为什么您不能缓存找到的操作,以便后续调用更具性能。

内部ReflectedControllerDescriptor也缓存结果,虽然似乎有一点开销,因为它每次都检查所有属性。它看起来像HttpPostAttribute和什么不是。

我的建议是坚持使用你正在使用的内容而不是自己缓存它。如果出于某种原因,底层方法的工作方式发生了变化,那么您已经了解了最新信息,并且不必担心改变存储缓存项目的方式。

相关问题