asp.net-web-api – 使用WebAPI和RavenDB进行基本会话处理
发布时间:2020-05-24 04:14:33 所属栏目:asp.Net 来源:互联网
导读:用这个作为基础APIController,想法?主要是对处理dispose中的savechanges感到好奇,而不是我在其他地方看到的ExecuteAsync方法… using System;using System.Net.Http;using System.Threading;using System.Threading.Tasks;using System.Web.Http;usi
|
用这个作为基础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; }
}
解决方法我更喜欢使用动作过滤器属性来管理基本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();
}
}
}
}
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; }
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – Visual Studio 2015的项目模板
- asp.net-mvc – 获取控制器和操作的完全限定URL?
- asp.net – SQL Reporting Services – 打印按钮未显示在Mo
- asp.net-mvc – .Net 4内存缓存类和用户会话
- .net – 我应该在HttpCookie.Expires和HttpCachePolicy.Set
- asp.net – IIS 6如何从http://example.com/*重定向到http:
- ASP.NET MVC =具有.NET类库的经典ASP.真?
- ASP.NET WebApi:(405)方法不允许
- asp.net – bing地图花钱?
- ASP.NET 5未在开发模式下运行
推荐文章
站长推荐
热点阅读
