为了在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相同的依赖范围。我不希望在我的控制器中没有用于刷新会话的代码。
答案 0 :(得分:9)
在JabbR中实际回答了您自己的问题时,GetDependencyScope
使用HttpRequestMessage
扩展方法可以解决您的问题:
var session = Request.GetDependencyScope().GetService(typeof(IDocumentSession));