2012-07-06 18 views
8

मैं एक ऐप बनाना शुरू कर रहा हूं, और मैं सर्विसस्टैक का उपयोग करने की योजना बना रहा हूं। बस जानना चाहते हैं कि NHibernate ISession या अन्य "प्रति अनुरोध" संदर्भ विशिष्ट सत्र ऑब्जेक्ट्स को संभालने के लिए सर्वोत्तम प्रथाओं/अच्छे दृष्टिकोण क्या हैं।सेवास्टैक NHibernate सत्र प्रति अनुरोध

मैं की तरह आईओसी में एक ISessionFactory पंजीकरण के बारे में सोचा:

container.Register<ISessionFactory>(sessionFactory); 

और एक नया सत्र वस्तु मिल जब जरूरत ... या हो सकता है सीधे सत्र वस्तु प्रदान करते हैं:

container.Register<ISession>(c => sessionFactory.OpenSession()).ReusedWithin(ReuseScope.None); 

या तो संभाल ISession और Global.asax BeginRequest ईवेंट के माध्यम से एक डिफ़ॉल्ट लेनदेन:

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    var session = factory.OpenSession(); 
    ITransaction itrans = session.BeginTransaction(); 
    Context.Items.Add("session", session); 
    Context.Items.Add("trans", itrans); 
} 

तो, मैं खो गया हूं, उपर्युक्त तकनीकों, या इसी तरह के ईएफ या अन्य आराम-सेवा ढांचे जैसे सर्वोत्तम प्रथाओं क्या हैं?

अग्रिम

उत्तर

3

धन्यवाद कैसे बेहतर ServiceStack और एक साथ NHibernate का उपयोग करने का एक पूरा उदाहरण के लिए इस ब्लॉग पोस्ट देखें:

public class Global : HttpApplication 
{ 
    public class SampleServiceAppHost : AppHostBase 
    { 
     private readonly IContainerAdapter _containerAdapter; 
     public SampleServiceAppHost(ISessionFactory sessionFactory) 
      : base("Service Stack with Fluent NHibernate Sample", typeof(ProductFindService).Assembly) 
     { 
      base.Container.Register<ISessionFactory>(sessionFactory); 
     } 

     public override void Configure(Funq.Container container) 
     { 
      container.Adapter = _containerAdapter; 
     } 
    } 

    void Application_Start(object sender, EventArgs e) 
    { 
     var factory = new SessionFactoryManager().CreateSessionFactory(); 

     (new SampleServiceAppHost(factory)).Init(); 
    } 
} 
:

http://www.philliphaydon.com/2012/06/using-nhibernate-with-servicestack/ यहाँ ऊपर पोस्ट में इस्तेमाल किया AppHost उदाहरण है

4

एक HttpHandler का उपयोग कर प्रति सत्र एक सत्र बनाना मुझे यह करने का सबसे आम तरीका है। Ayende ने समझाया है कि एक सत्र बनाना वास्तव में हल्का वजन है। http://ayende.com/blog/4123/what-is-the-cost-of-opening-a-session

आयेंडे में वास्तव में पदों की श्रृंखला है जहां वह धीरे-धीरे डेटा एक्सेस समाधान बनाता है। प्रत्येक पोस्ट बताती है कि उसने ऐसा क्यों किया जो उन्होंने किया और अब तक किए गए कदमों के साथ किस मुद्दे को हल करने की आवश्यकता है। यहां से शुरू करें: http://ayende.com/blog/4803/refactoring-toward-frictionless-odorless-code-the-baseline

अंत में, http://nhforge.org/blogs/nhibernate/archive/2011/03/03/effective-nhibernate-session-management-for-web-apps.aspx

उपरोक्त सभी अनुरोध के अनुसार सत्र के रूपांतरों हैं। सभी चीज़ों को आम तौर पर सत्र/लेनदेन बनाने के बारे में चिंता करने की ज़रूरत नहीं है। वे स्वचालित रूप से लेनदेन को प्रतिबद्ध/रोलबैक करेंगे।

3

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे लगा कि मैं आगे बढ़ूंगा और किसी को भी दिखाऊंगा जो अभी भी एक वैकल्पिक उत्तर में रूचि रखता है कि हमने यह कैसे किया।

हम नए ServiceStack एपीआई thusly में ServiceRunner उपयोग कर रहे हैं:

public class BaseServiceRunner<TRequest> : ServiceRunner<TRequest> 
{ 
    public BaseServiceRunner(AppHost appHost, ActionContext actionContext) 
    : base(appHost, actionContext) { } 

    public override void OnBeforeExecute(IRequestContext requestContext, TRequest request) 
    { 
     var req = request as MyRequestType; 

     if(req == null) 
      base.OnBeforeExecute(requestContext, request); 

     var factory = TryResolve<NHibernate.ISessionFactory>(); 
     var session = factory.OpenSession(); 
     var trans = session.BeginTransaction(IsolationLevel.ReadCommitted); 

     requestContext.SetItem("session", session); 
     requestContext.SetItem("transaction", trans); 
    }   

    public override object OnAfterExecute(IRequestContext requestContext, object response) 
    { 
     var trans = requestContext.GetItem("transaction") as ITransaction; 
     if (trans != null && trans.IsActive) 
      trans.Commit(); 

     var session = requestContext.GetItem("session") as ISession; 
     if (session != null) 
     { 
      session.Flush(); 
      session.Close(); 
     } 

     return base.OnAfterExecute(requestContext, response); 
    } 

    public override object HandleException(IRequestContext requestContext, TRequest request, Exception ex) 
    { 
     var req = request as MyRequestType; 
     if(req != null) 
     { 
      var trans = requestContext.GetItem("transaction") as ITransaction; 
      if (trans != null && trans.IsActive) 
       trans.Rollback(); 

      var session = requestContext.GetItem("session") as ISession; 
      if (session != null) 
      { 
       session.Flush(); 
       session.Close(); 
      } 
     } 
     return base.HandleException(requestContext, request, ex); 
    }   
} 
+1

आप कैसे आप इस के लिए इस्तेमाल किया पर विस्तृत कृपया कर सकते हैं? सर्विसस्टैक दस्तावेज़ वास्तव में इन ServiceRunners का उपयोग करने के तरीके पर समझ में नहीं आता है .. – slashp

+0

मैंने आपके ऐप होस्ट में जोड़ने के लिए कोड जोड़ा। सुनिश्चित नहीं है कि सेवा से सेवा धावक का उपयोग कैसे करें। –

+0

बस अधिक जानकारी के लिए अनुरोधों को देखा, सहायक होने में बहुत देर हो सकती है, लेकिन शायद कोई और जानना चाहता है। 'कोड' पब्लिक क्लास ऐपहोस्ट: ऐपहोस्टबेस { सार्वजनिक ऐपहोस्ट(): आधार (" सेवा ", टाइपऑफ (एक्सेस सेवा)।विधानसभा) { } सार्वजनिक ओवरराइड शून्य कॉन्फ़िगर (कंटेनर कंटेनर) { } सार्वजनिक ओवरराइड IServiceRunner CreateServiceRunner (ActionContext actionContext) { नई BaseServiceRunner लौट (यह, actionContext); } 'कोड' –

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