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);
    }
}

インジェクトするために、各フィルターをループし、セッターインジェクション(StructureMap)を使用して依存関係を設定するIDocumentSessionカスタムを作成しました。IFilterProvider

のインスタンスがどのようにIFilterProviderスコープされているか知りたいのですが。この記事を読むと、コントローラーはリクエストごとに作成されているようです。

IDocumentSession現在、 StructureMapを使用してリクエストごとに明示的にスコープを設定しています。IDependencyScope問題は、代わりに(ネストされたコンテナーを使用する)に依存する場合、同じインスタンスがIDocumentSessionアクションフィルターに注入されるかどうかです。

[アップデート]

さらにテストすると、アクションフィルターはコントローラーと同じ依存関係スコープを使用していないように見えます。ただし、コントローラーでセッションをフラッシュするためのコードは使用したくありません。

4

1 に答える 1

9

JabbRで実際に自分の質問に答えたので、GetDependencyScope拡張メソッドを使用HttpRequestMessageすると問題が解決するはずです。

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