asp.net-web-api – 使用WebAPI和RavenDB进行基本会话处理
发布时间:2020-12-15 23:07:31 所属栏目:asp.Net 来源:网络整理
导读:用这个作为基础APIController,想法?主要是对处理dispose中的savechanges感到好奇,而不是我在其他地方看到的ExecuteAsync方法… using System;using System.Net.Http;using System.Threading;using System.Threading.Tasks;using System.Web.Http;using Syst
用这个作为基础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应用程序从Session.Remove实现中抛出System.NullRef
- asp.net-web-api – 在没有Identity的情况下使用Bearer / J
- 在asp.net控件的style属性中使用DataBinder.Eval()
- asp.net – SignalR Autofac OWIN:为什么GlobalHost.Conne
- asp.net-mvc – 如何使用Castle.Windsor传递带有依赖注入的
- asp.net-mvc – 如何使用ASP.NET MVC 3编辑IEnumerable?
- asp.net-mvc – Asp.net MVC控制器Action字符串参数未通过
- asp-classic – 从ASP.Classic中的Web.Config读取Connectio
- asp.net-mvc – Ninject mvc3无法从程序集加载WebActivator
- bin文件中的任何文件是否有任何更改会导致ASP.NET Web应用程
推荐文章
站长推荐
- asp.net-membership – MiniProfiler和SqlMember
- asp.net-mvc – 如何在点击电子邮件超链接时打开
- ASP.NET网站中使用Ninject 3进行依赖注入
- asp.net-mvc – 在asp.net mvc中使用IDataErrorI
- 代理模式-aop
- asp.net – 如何使用DataReader填充DataTable
- asp.net-mvc – 具有长不存在的URL的ASP.NET MVC
- asp.net-mvc – 如何在.NET MVC中防止多个表单提
- asp.net-mvc – angularjs和mvc5之间通信的最佳方
- asp.net-mvc – 我的web.config中没有角色管理器
热点阅读