2012-01-01 17 views
5

मुझे आश्चर्य है कि मेरी सेवा परत को मेरे भंडार के बारे में कितना पता होना चाहिए? पिछले प्रोजेक्ट में मैंने हमेशा सूचियां लौटाईं और मुझे आवश्यक प्रत्येक चीज़ के लिए एक विधि थी।NHibernate के साथ रिपोजिटरी पैटर्न?

तो अगर मुझे उन सभी पंक्तियों को वापस करने की आवश्यकता है जिनमें 5 का आईडी था जो एक विधि होगी। मेरे पास बनाने, अद्यतन करने, हटाने और अन्य NHibernate विकल्पों के लिए सामान्य भंडार है लेकिन पूछताछ के लिए मैं नहीं करता हूं।

अब मैं अधिक IQueryable का उपयोग शुरू कर रहा हूं क्योंकि मैंने प्रत्येक मामले के लिए कई विधियों की समस्याओं में भागना शुरू कर दिया है।

कहें कि मुझे उन सभी को वापस करने की आवश्यकता है जिनके पास एक निश्चित आईडी था और 3 टेबल की आवश्यकता है जहां उत्सुकता से यह एक नई विधि होगी। अगर मुझे एक निश्चित आईडी की आवश्यकता है और कोई उत्सुक लोडिंग नहीं है जो एक अलग विधि होगी।

तो अब मैं सोच रहा हूं कि मैं कहां से क्लॉज भाग करता हूं और IQueryable लौटाता हूं तो मैं परिणाम जोड़ सकता हूं (यानी अगर मुझे उत्सुक लोडिंग करने की आवश्यकता है)।

एक ही समय में यह सेवा परत को रिपोजिटरी परत के बारे में अधिक जागरूक बनाता है और अब मैं रिपोजिटरी को जितना आसान नहीं कर सकता उतना आसान है क्योंकि अब सेवा परत में विशिष्ट एनएचबेर्नेट है।

मैं भी यकीन नहीं है कि कैसे मजाक प्रभाव होता हूँ।

तो अब मैं सोच रहा हूं कि अगर मैं इस मार्ग से नीचे जाता हूं तो अगर रिपोजिटरी की आवश्यकता होती है क्योंकि ऐसा लगता है कि वे एक साथ मिश्रित हैं।

संपादित

अगर मैं अपने भंडार से छुटकारा पाने और सिर्फ मेरी सेवा परत में सत्र है वहाँ तो काम वर्ग की एक इकाई होने के लिए एक बिंदु है?

public class UnitOfWork : IUnitOfWork, IDisposable 
    { 
     private ITransaction transaction; 
     private readonly ISession session; 

     public UnitOfWork(ISession session) 
     { 
      this.session = session; 
      session.FlushMode = FlushMode.Auto; 
     } 

     /// <summary> 
     /// Starts a transaction with the database. Uses IsolationLevel.ReadCommitted 
     /// </summary> 
     public void BeginTransaction() 
     { 
      transaction = session.BeginTransaction(IsolationLevel.ReadCommitted); 
     } 

     /// <summary> 
     /// starts a transaction with the database. 
     /// </summary> 
     /// <param name="level">IsolationLevel the transaction should run in.</param> 
     public void BeginTransaction(IsolationLevel level) 
     { 
      transaction = session.BeginTransaction(level); 
     } 

     private bool IsTransactionActive() 
     { 
      return transaction.IsActive; 
     } 

     /// <summary> 
     /// Commits the transaction and writes to the database. 
     /// </summary> 
     public void Commit() 
     { 
      // make sure a transaction was started before we try to commit. 
      if (!IsTransactionActive()) 
      { 
       throw new InvalidOperationException("Oops! We don't have an active transaction. Did a rollback occur before this commit was triggered: " 
                  + transaction.WasRolledBack + " did a commit happen before this commit: " + transaction.WasCommitted); 
      } 

      transaction.Commit(); 
     } 

     /// <summary> 
     /// Rollback any writes to the databases. 
     /// </summary> 
     public void Rollback() 
     { 
      if (IsTransactionActive()) 
      { 
       transaction.Rollback(); 
      } 
     } 

     public void Dispose() // don't know where to call this to see if it will solve my problem 
     { 
      if (session.IsOpen) 
      { 
       session.Close(); 
      } 

     } 

उत्तर

4

प्रत्येक व्यक्ति के पास राय है कि रिपोजिटरी का उपयोग कैसे करें, सारणी आदि का उपयोग कैसे करें। Ayende Rahien को इस मुद्दे के बारे में कुछ अच्छी पोस्ट मिली हैं: Architecting in the pit of doom: The evils of the repository abstraction layer और Repository is the new Singleton। वे आपको कुछ अच्छे कारण बताते हैं कि आपको NHibernate के ISession के शीर्ष पर अभी तक एक और अमूर्तता बनाने की कोशिश क्यों नहीं करनी चाहिए।

+0

मैं इसमें और अधिक देखूंगा। मुझे जो चीज मिलती है वह मुझे यह विचार पसंद है कि सर्विस लेयर डेटाबेस के बारे में कुछ भी नहीं जानता है जिससे यूनिट टेस्ट (यदि मुझे कभी आवश्यकता हो) और ओआरएम को स्विच करना आसान हो जाता है। आप इन परिदृश्यों को कैसे संभालेंगे? – chobo2

+0

मैं यह भी सोच रहा हूं कि क्या मैं रिपॉजिटरीज़ से छुटकारा पाता हूं तो क्या वर्क क्लास की मेरी इकाई का एक बिंदु है? देखें – chobo2

+0

आप सत्र को लपेटने के लिए यूनिटऑफवर्क का उपयोग कर सकते हैं, या यहां तक ​​कि एनएच सत्र का भी उपयोग कर सकते हैं। यूनिट परीक्षण के लिए, आप इकाई परीक्षण ** के लिए ** इन-मेमोरी डेटाबेस का उपयोग कर सकते हैं ** ** NHiberate के साथ। http://ayende.com/blog/3983/nhibernate-unit-testing –

2

NHibernate के बारे में बात यह है कि यदि आप इसे अमूर्त करने की कोशिश नहीं करते हैं तो यह आपको सबसे अधिक देता है। अपनी सेवा परत को एनएचबेर्नेट पर निर्भर करना जरूरी नहीं है कि यह एक बुरी चीज है। यह आपको सत्र, कैशिंग और अन्य एनएचबीरनेट सुविधाओं पर नियंत्रण प्रदान करता है, और इस प्रकार आपको प्रदर्शन को कम करने में सक्षम बनाता है, न कि आपके द्वारा वर्णित सभी अनावश्यक रैपिंग कोड से आपको सहेजने का उल्लेख न करें।

+1

इस उत्तर में जोड़ना: एनएचबीर्नेट सत्र यूनिटऑफवर्क – ivowiblo

+1

है इसलिए मैं सोच रहा हूं कि क्या यूनिटऑफवर्क क्लास में कोई बिंदु है यदि मैं रिपोजिटरी पैटर्न का उपयोग नहीं कर रहा हूं? – chobo2

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