Basic session processing using WebAPI and RavenDB

Using this as a basic APIC controller, thoughts? basically they are curious to handle savechanges at their disposal, as well as the ExecuteAsync method, which I saw elsewhere ...

using System; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using System.Web.Http; using System.Web.Http.Controllers; using Raven.Client; using Raven.Client.Document; public abstract class RavenDbController : ApiController { private IDocumentStore _documentStore; public IDocumentStore Store { get { return _documentStore ?? (_documentStore = LazyDocStore.Value); } set { _documentStore = value; } } protected override void Initialize(HttpControllerContext controllerContext) { Session = Store.OpenSession(); base.Initialize(controllerContext); } protected override void Dispose(bool disposing) { using (Session) { Session.SaveChanges(); } } public IDocumentSession Session { get; set; } } 
+6
source share
1 answer

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; // Can be set explicitly in unit testing if (controller.RavenSession != null) return; controller.RavenSession = store.OpenSession(); controller.RavenSession.Advanced.UseOptimisticConcurrency = true; } public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { var controller = actionExecutedContext.ActionContext.ControllerContext.Controller as AbstractApiController; if (controller == null) return; using (var session = controller.RavenSession) { if (session == null) return; if (actionExecutedContext.Exception != null) { session.SaveChanges(); } } } } 

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; } } 
+12
source

All Articles