用这个作为基础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; } }
原文地址:https://www.jb51.cc/aspnet/246844.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。