3

为了在 ASP.NET WebApi 中刷新对 RavenDB 的更改,我创建了以下操作过滤器:

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范围如何。阅读这篇文章,控制器似乎是根据请求创建的。

目前,我正在IDocumentSession使用 StructureMap 明确界定每个请求的范围。问题是,如果我改为依赖IDependencyScope(使用嵌套容器的)相同的实例会IDocumentSession被注入到我的动作过滤器中吗?

[更新]

进一步测试,似乎动作过滤器不使用与控制器相同的依赖范围。但是,我不希望在我的 Controller 中有用于刷新会话的代码。

4

1 回答 1

9

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

var session = Request.GetDependencyScope().GetService(typeof(IDocumentSession));
于 2012-07-24T11:21:12.323 回答