I prefer to use the action filter attribute to control the life cycle of the session object on the base API controller. See the following code demonstrating this approach:
public class RavenSessionManagementAttribute : ActionFilterAttribute { private readonly IDocumentStore store; public RavenSessionManagementAttribute(IDocumentStore store) { if (store == null) throw new ArgumentNullException("store"); this.store = store; } public override void OnActionExecuting(HttpActionContext actionContext) { var controller = actionContext.ControllerContext.Controller as AbstractApiController; if (controller == null) return;
FilterConfig.cs:
public class FilterConfig { public static void RegisterGlobalFilters(HttpFilterCollection filters) { filters.Add(new RavenSessionManagementAttribute(DocumentStoreHolder.Store)); } }
AbstractApiController.cs:
public abstract class AbstractApiController : ApiController { public IDocumentSession RavenSession { get; set; } }
source share