2015-03-24 6 views
6

के बीच एक एनएचबीर्नेट सत्र साझा करना मैं एनएचबेर्नेट के साथ यूनिटऑफवर्क और रिपोजिटरी पैटर्न को कार्यान्वित करने की कोशिश कर रहा हूं। मैं कार्य उदाहरण और भंडार उदाहरण की इकाई के बीच सत्र साझा करने का सबसे अच्छा तरीका ढूंढ रहा हूं।यूनिटऑफवर्क और रिपोजिटरी

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class 
{ 
    protected ISession Session { get { return UnitOfWork.Current.Session; } } 

    //other code 
} 

हालांकि मैं उपरोक्त और करने का फैसला किया कार्यान्वयन पसंद नहीं आया:

सबसे स्पष्ट रास्ताRepository कक्षा में UnitOfWork कक्षा में ThreadStatic गुण पेश करने

public class UnitOfWork : IUnitOfWork 
{ 
    public static UnitOfWork Current 
    { 
     get { return _current; } 
     set { _current = value; } 
    } 
    [ThreadStatic] 
    private static UnitOfWork _current; 

    public ISession Session { get; private set; } 

    //other code 
} 

और फिर है ऐसा करने के लिए एक और तरीका खोजें।

तो मैं दूसरा तरीका साथ आया:

public interface ICurrentSessionProvider : IDisposable 
{ 
    ISession CurrentSession { get; } 
    ISession OpenSession(); 
    void ReleaseSession(); 
} 

public class CurrentSessionProvider : ICurrentSessionProvider 
{ 
    private readonly ISessionFactory _sessionFactory; 

    public CurrentSessionProvider(ISessionFactory sessionFactory) 
    { 
     _sessionFactory = sessionFactory; 
    } 

    public ISession OpenSession() 
    { 
     var session = _sessionFactory.OpenSession(); 
     CurrentSessionContext.Bind(session); 
     return session; 
    } 

    public void Dispose() 
    { 
     CurrentSessionContext.Unbind(_sessionFactory); 
    } 

    public ISession CurrentSession 
    { 
     get 
     { 
      if (!CurrentSessionContext.HasBind(_sessionFactory)) 
      { 
       OnContextualSessionIsNotFound(); 
      } 
      var contextualSession = _sessionFactory.GetCurrentSession(); 
      if (contextualSession == null) 
      { 
       OnContextualSessionIsNotFound(); 
      } 
      return contextualSession; 
     } 
    } 

    private static void OnContextualSessionIsNotFound() 
    { 
     throw new InvalidOperationException("Session is not opened!"); 
    } 
} 

जहां ISessionFactory सिंगलटन autofac द्वारा हल हो गई है और CurrentSessionContextCallSessionContext है। फिर मैं UnitOfWork और Repository कक्षाओं के रचनाकारों में ICurrentSessionProvider इंजेक्ट करता हूं और सत्र साझा करने के लिए CurrentSession संपत्ति का उपयोग करता हूं।

दोनों दृष्टिकोण ठीक काम कर रहे प्रतीत होते हैं। तो मुझे आश्चर्य है कि इसे लागू करने के अन्य तरीके हैं? काम और भंडार की इकाई के बीच सत्र साझा करने में सबसे अच्छा अभ्यास क्या है?

उत्तर

0

ऐसा करने का सबसे अच्छा तरीका एनएचबीर्नेट पहले से ही इस प्रभाव को प्रदान करने वाली सुविधाओं का लाभ उठाना होगा। कृपया अनुभाग को देखो निम्नलिखित प्रलेखन पर "2.3 प्रासंगिक सत्र।": http://nhibernate.info/doc/nh/en/#architecture-current-session

मूल रूप से, आप की जरूरत:

  1. ICurrentSessionContext इंटरफेस कि अपनी आवश्यकताओं को संतुष्ट करता है का एक उपयुक्त कार्यान्वयन।
  2. सत्र फ़ैक्टरी को सूचित करें कि आप उस कार्यान्वयन का उपयोग करना चाहते हैं।
  3. किसी भी स्थान पर ISessionFactory (आपका सत्र फ़ैक्टरी) इंजेक्ट करें जिसमें आपको "वर्तमान सत्र" तक पहुंचने की आवश्यकता है।
  4. sessionFactory.GetCurrentSession() का उपयोग करके वर्तमान सत्र प्राप्त करें।

यह लाभ यह है कि अपने सत्र से निपटने की रणनीति कैसे यह सबसे NHibernate परियोजनाओं द्वारा किया जाना चाहिए के साथ संगत हो जाएगा है और यह स्थानों में एक ISessionFactory के अलावा कुछ भी होने पर निर्भर नहीं करता आप वर्तमान सत्र तक पहुंचना चाहते हैं ।

उल्लेख करना भूल गए: आप अपने प्रश्न में पहले से सूचीबद्ध कोड के आधार पर अपने स्वयं के ICurrentSessionContext को लागू कर सकते हैं।

+0

उम्मीद कर रहा था कि आप इस विशेष आर्किटेक्चर को स्थापित करने के लिए कोड नमूना प्रदान कर सकते हैं! – adaam

+0

अरे, मैं अभी जल्दी में हूं, लेकिन हो सकता है कि निम्नलिखित बहुत ही सरल नमूना आपको प्रारंभ करने में मदद कर सकें (देखेंगे कि मैं इसे बाद में अपडेट कर सकता हूं): https://gist.github.com/anonymous/ ebd36d4a39c2ed45dd20824d849f89f7 –

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