14

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

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

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

这是最佳方法吗?

类被命名的事实ReflectedControllerDescriptor让我想知道这个操作是否有很高的成本,因为它将在每个页面请求上执行?与此相关的是这个类是在内部缓存还是我应该ReflectedControllerDescriptors明确地缓存?

4

1 回答 1

9

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

ReflectedControllerDescriptor虽然似乎有一点开销,但内部也会缓存结果,因为它每次都会检查所有属性。它看起来适用于类似的东西HttpPostAttribute,而不是什么。

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

于 2012-06-01T17:51:31.647 回答