2013-03-03 8 views
6

के साथ मूल सत्र हैंडलिंग आधार एपीकंट्रोलर, विचारों के रूप में इसका उपयोग करना? ज्यादातर निपटाने में SaveChanges से निपटने के बारे में उत्सुक im, बनाम 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; } 

} 

उत्तर

12

मैं पर सत्र वस्तु के जीवन चक्र प्रबंधन करने के लिए आदेश में एक कार्रवाई फिल्टर विशेषता का उपयोग पसंद करते हैं आधार एपीआई नियंत्रक।

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; } 
    } 
+0

बहुत अच्छा लगता है, मैं इसे एक शॉट दे देंगे। –

+0

@ फ़िट्ज़ाक्यित्ट्ज़ाकी: प्रश्न में (आसान दिखने वाले) दृष्टिकोण के बजाय मैं इसका उपयोग क्यों करना चाहूंगा? * (नोट: मैं एक वेब एपीआई ** और ** रावेनडीबी शुरुआती हूं, इसलिए यह संभव है कि मुझे कुछ याद आ रहा है) * –

+1

क्योंकि यह आधार नियंत्रक को जोड़ने के बजाय एक विशेषता में कार्यक्षमता को समाहित करता है। यह आधार नियंत्रक को और अधिक साफ रखता है। –

संबंधित मुद्दे