Mon*_*s X 6 ravendb asp.net-web-api
用这个作为基础APIController,想法?主要是对处理dispose中的savechanges感到好奇,而不是我在其他地方看到的ExecuteAsync方法...
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; }
}
Run Code Online (Sandbox Code Playgroud)
Fit*_*aki 12
我更喜欢使用动作过滤器属性来管理基本API控制器上的会话对象的生命周期.请参阅以下代码以演示此方法:
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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
FilterConfig.cs:
public class FilterConfig
{
public static void RegisterGlobalFilters(HttpFilterCollection filters)
{
filters.Add(new RavenSessionManagementAttribute(DocumentStoreHolder.Store));
}
}
Run Code Online (Sandbox Code Playgroud)
AbstractApiController.cs:
public abstract class AbstractApiController : ApiController
{
public IDocumentSession RavenSession { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1672 次 |
| 最近记录: |