【问题标题】:ASP.NET WebApi Action Filters and Dependency ScopeASP.NET WebApi 操作过滤器和依赖范围
【发布时间】:2012-07-23 13:34:15
【问题描述】:

为了在 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 的实例是如何作用域的。阅读this article 似乎控制器是根据请求创建的。

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

[更新]

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

【问题讨论】:

  • 我没有答案,但本文讨论的是过滤器和 DI bradwilson.typepad.com/blog/2010/07/…
  • @suing 这是指 MVC 中的 DI。我的问题是指 ASP.NET WebApi 中的 DI。两者完全不同。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2013-02-19
    • 1970-01-01
    相关资源
    最近更新 更多