ASP.NET WebApi操作筛选器和依赖关系范围

时间:2012-07-23 13:34:15

标签: structuremap asp.net-web-api ravendb

为了在ASP.NET WebApi中刷新对RavenDB的更改,我创建了以下Action Filter:

public class RavenDbUnitOfWorkAttribute : ActionFilterAttribute
{
    public Func<IDocumentSession> SessionFactory { get; set; }

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        var session = SessionFactory.Invoke();

        if (session != null && actionExecutedContext.Exception == null)
        {
            session.SaveChanges();
        }

        base.OnActionExecuted(actionExecutedContext);
    }
}

注入IDocumentSession我创建了一个循环遍历每个过滤器的自定义IFilterProvider,并使用setter注入(StructureMap)设置任何依赖项。

我想知道IFilterProvider的实例是如何作用的。阅读this article,看起来每个请求都会创建控制器。

目前,我正在使用StructureMap明确确定每个请求的IDocumentSession。问题是,如果我依赖IDependencyScope(使用嵌套容器)将同一个IDocumentSession实例注入我的Action Filter?

[更新]

进一步测试似乎Action Filters不使用与Controller相同的依赖范围。我不希望在我的控制器中没有用于刷新会话的代码。

1 个答案:

答案 0 :(得分:9)

JabbR中实际回答了您自己的问题时,GetDependencyScope使用HttpRequestMessage扩展方法可以解决您的问题:

var session = Request.GetDependencyScope().GetService(typeof(IDocumentSession));