Asp.net mvc 3 ASP.NET MVC 3、操作过滤器和Autofac依赖项注入

Asp.net mvc 3 ASP.NET MVC 3、操作过滤器和Autofac依赖项注入,asp.net-mvc-3,autofac,action-filter,Asp.net Mvc 3,Autofac,Action Filter,在ASP.NET MVC 2上,我有一个名为[Transaction]的ActionFilterAttribute,它在执行操作之前启动NHibernate事务,然后提交或回滚,具体取决于是否引发异常。ISession实例是httprequestscope()并由注入。它看起来像这样,而且效果很好: [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)] public sealed class TransactionA

在ASP.NET MVC 2上,我有一个名为
[Transaction]
ActionFilterAttribute
,它在执行操作之前启动NHibernate事务,然后提交或回滚,具体取决于是否引发异常。
ISession
实例是
httprequestscope()
并由注入。它看起来像这样,而且效果很好:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public sealed class TransactionAttribute : ActionFilterAttribute
{
    private ITransaction transaction;

    public TransactionAttribute()
    {
        this.Order = 0;
    }

    public ISession Session
    {
        get;
        set;
    }

    public override void OnActionExecuted(
        ActionExecutedContext filterContext)
    {
        if (this.Session != null && this.transaction != null)
        {
            try
            {
                if (this.transaction.IsActive)
                {
                    if (filterContext.Exception == null)
                    {
                        this.transaction.Commit();
                    }
                    else
                    {
                        this.transaction.Rollback();
                    }
                }
            }
            finally
            {
                this.transaction.Dispose();
                this.transaction = null;
            }
        }
    }

    public override void OnActionExecuting(
        ActionExecutingContext filterContext)
    {
        if (this.Session != null)
        {
            this.transaction = this.Session.BeginTransaction();
        }
    }
}
太棒了

在ASP.NET MVC 3的注释中,我看到了“打破变化”(我的重点)下面的这个小广告:

在ASP.NET MVC的早期版本中,除了少数情况外,每个请求都会创建操作筛选器。这种行为从来都不是有保证的行为,而仅仅是一个实现细节,而过滤器的契约则认为它们是无状态的。在ASP.NET MVC 3中,过滤器被更积极地缓存。因此,任何不正确存储实例状态的自定义操作筛选器都可能被破坏

哎呀

  • 这是否意味着如果我升级到MVC 3,我就被套住了
  • 如果每个请求不再实例化操作筛选器,我们将如何将请求范围的依赖项放入操作筛选器中

谢谢你的帮助。

哦,真恶心。。。。Nicholas,您可能需要将ISession和事务存储在HttpContext.Items中,您应该能够通过ActionExecuteContext/ActionExecutingContext(可能在OnActionExecuting事件处理程序中进行设置)访问它们,而不是将它们保存在实例成员中。或者你可以在你的过滤器里调用ServiceLocator来为你抓取它们(也很恶心)


现在我必须检查一下我的MVC3代码,看看我自己是否有类似的问题

我刚刚在谷歌论坛上问了一个类似的问题。 这里是链接

我得到了答案:

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


builder.RegisterControllers(Assembly.GetExecutingAssembly()).InjectActionInvoker();
builder.RegisterType().As();
RegisterController(Assembly.GetExecutionGassembly()).InjectActionInvoker();

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

是的,发行说明注释似乎适用于MVC中的默认设置——但是IoC容器会覆盖它以提供它们自己的行为。