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
アクションフィルターに注入されるかどうかです。
[アップデート]
さらにテストすると、アクションフィルターはコントローラーと同じ依存関係スコープを使用していないように見えます。ただし、コントローラーでセッションをフラッシュするためのコードは使用したくありません。