ASP.NET MVC 3,动作过滤器和Autofac依赖注入

时间:2011-01-14 21:01:00

标签: asp.net-mvc-3 autofac action-filter

ASP.NET MVC 2 上,我有一个名为ActionFilterAttribute的{​​{1}},它在执行操作之前启动NHibernate事务,然后提交或回滚它,具体取决于是否或者没有抛出异常。 [Transaction]实例为ISession,并由Autofac注入。它看起来像这样,效果很好:

HttpRequestScoped()

优秀。 Seems to be a common pattern.

ASP.NET MVC 3 备注中,我在“突破性变化”(强调我的)下看到了这一点:

  

在以前版本的ASP.NET MVC中,除了少数情况外,每个请求都创建了动作过滤器。这种行为从来都不是保证行为,而只是一个实现细节,而过滤器的合同是将它们视为无状态。在ASP.NET MVC 3中,过滤器更积极地缓存。因此,任何不正确地存储实例状态的自定义操作过滤器都可能被破坏。

糟糕。

  • 这是否意味着如果我升级到MVC 3,我就会被冲洗?
  • 如果每个请求不再实例化操作过滤器,我们如何将请求范围的依赖项纳入我们的操作过滤器?

感谢您的任何见解。

2 个答案:

答案 0 :(得分:6)

我刚刚在谷歌论坛上提出了类似的问题。 这是链接https://groups.google.com/forum/#!topic/autofac/a0qqp2b3WA8

我得到了答案:

builder.RegisterType<ExtensibleActionInvoker>().As<IActionInvoker>();


builder.RegisterControllers(Assembly.GetExecutingAssembly()).InjectActionInvoker();

然后,您可以在属性中使用属性注入。

答案 1 :(得分:2)

哦,好吧.... Nicholas,您可能需要将您的ISession和Transaction存储在HttpContext.Items中,您应该能够通过ActionExecutedContext / ActionExecutingContext(可能在OnActionExecuting事件处理程序中设置它)来获取它,而不是将他们留在实例成员中要么就是这样,或者你可以在你的过滤器中调用ServiceLocator为你抓住它们(也是哎呀)。

现在我必须查看我的MVC 3代码,看看我自己是否有任何类似的问题!