2009-06-11 10 views
5

मैं एनएचबीरनेट द्वारा पहले से प्रदान किए गए पहले के ऊपर एक यूओडब्ल्यू कार्यान्वयन कब लिखूंगा? कोई वास्तविक दुनिया उदाहरण?मैं NHBernate सत्र के शीर्ष पर वर्क पैटर्न का यूनिट क्यों उपयोग करूंगा?

उत्तर

5

काम आप का वर्णन कर रहे हैं पहले से ही NHibernate द्वारा प्रदान की जाती है की इकाई तो वहाँ की एक ऐसी इकाई ऐसा करने के लिए कोई कारण नहीं है काम।

हमारे डब्ल्यूसीएफ सेवा में हमारे पास जो काम है वह उच्च स्तर की इकाई है जिसमें काम की वर्तमान इकाई के लिए हमारे आवेदन में महत्वपूर्ण जानकारी शामिल है। इसमें हमारे लिए NHibernate ISession को सारणित करना शामिल है। जब आप इसे तोड़ते हैं तो आपके पास कोड है जो तीन श्रेणियों में फिट बैठता है

  1. कोड जो यूनिट ऑफ वर्क से निपटने की आवश्यकता है। इससे कोई फर्क नहीं पड़ता कि काम की इकाई का समर्थन कौन करता है। यह NHibernate, iBatis या एक कस्टम ORM हो सकता है। सभी कोड को लोड, रोलबैक, सेव इत्यादि करना है। यह ऐसा करने के लिए उपयोग की जाने वाली तंत्र के बारे में भी नहीं है।

  2. कोड जो किसी ISession से सीधे निपटने की आवश्यकता है क्योंकि यह NHibernate विशिष्ट चीजें कर रहा है। आम तौर पर इसे जटिल प्रश्नों के साथ करना पड़ता है जिन्हें बनाने की आवश्यकता होती है।

  3. यह जानने की आवश्यकता नहीं है कि यह कार्य इकाई में चल रहा है या आईएसशन तक पहुंच रहा है। हम इस चर्चा के हिस्से के रूप में इसे पूरी तरह से अनदेखा कर सकते हैं।

1. में कोड सिर्फ एक ISession के खिलाफ काम कर सकता था जबकि हमारे वरीयता कोड है कि हम सीधे नियंत्रित नहीं करते हैं या कि बदल सकता है में सार दूर बातें करने की कोशिश की है। इसके दो कारणों के लिए मूल्य है।

  • जब हमने शुरू किया हम एनएचबर्ननेट पर 100% बेचे गए नहीं थे। हम iBatis या कुछ कस्टम पर विचार कर रहे थे। जाहिर है यह अब कोई मुद्दा नहीं है।

  • पूरी टीम एनएचबेर्नेट में विशेषज्ञ नहीं हैं और न ही हम उन्हें बनना चाहते हैं। अधिकांश भाग के लिए लोग कोड लिखते हैं जो श्रेणी 1 में फिट बैठता है और जो कुछ वे जानते हैं वह हमारी कार्य इकाई है। जब श्रेणी 2 में कोड लिखा जाना है तो यह उस टीम के लोगों द्वारा लिखा जाता है जो एनएचबीर्नेट को अच्छी तरह से समझते हैं।

तो मैं कहूँगा कि यूनिट के प्रकार कार्य के बारे में आप की जरूरत नहीं है मेरा सुझाव है कि काम के एक उच्च स्तर यूनिट मूल्य का एक बहुत प्रदान कर सकते हैं बात कर रहे हैं बंद हुआ। प्रारंभ - - प्रतिबद्ध - रोलबैक - IDisposable.Dispose

मैं दोनों सत्र और लेनदेन के प्रबंधन के लिए इसका इस्तेमाल करते हैं

+0

शेनके, मेरे पास एक समान सवाल है, और ऐसा लगता है जैसे आपने एक यूनिट ऑफ वर्क बनाया है जो मेरी आवश्यकताओं को मेरी तुलना में बेहतर बनाता है। क्या आप मेरे प्रश्न पर नजर डालें और अपना $ 0.02 पेश कर सकते हैं? http://stackoverflow.com/questions/2604762/using-unit-of-work-design-pattern-nhibernate-sessions-in-an-mvvm-wpf – Echiban

0

बशर्ते आप अपने सभी मैपिंग्स को सही तरीके से स्थापित करें (यानी कैस्केड), आपको कुछ भी विशेष करने की ज़रूरत नहीं है और ISession ठीक काम करेगा। हालांकि, यदि आप 3-स्तरीय एप्लिकेशन लिख रहे हैं, तो आपको एक ही लेन-देन में किए जाने वाले डेटाबेस ऑपरेशंस को मैन्युअल रूप से अनुक्रमित करना होगा। फाउलर की "संदर्भ कार्यान्वयन" "उद्यम अनुप्रयोग वास्तुकला के पैटर्न" में एक अच्छा प्रारंभिक बिंदु हो सकता है:

class UnitOfWork... 

    public void registerNew(DomainObject obj) { 
     Assert.notNull("id not null", obj.getId()); 
     Assert.isTrue("object not dirty", !dirtyObjects.contains(obj)); 
     Assert.isTrue("object not removed", !removedObjects.contains(obj)); 
     Assert.isTrue("object not already registered new", !newObjects.contains(obj)); 
     newObjects.add(obj); 
    } 
    public void registerDirty(DomainObject obj) { 
     Assert.notNull("id not null", obj.getId()); 
     Assert.isTrue("object not removed", !removedObjects.contains(obj)); 
     if (!dirtyObjects.contains(obj) && !newObjects.contains(obj)) { 
     dirtyObjects.add(obj); 
     } 
    } 
    public void registerRemoved(DomainObject obj) { 
     Assert.notNull("id not null", obj.getId()); 
     if (newObjects.remove(obj)) return; 
     dirtyObjects.remove(obj); 
     if (!removedObjects.contains(obj)) { 
     removedObjects.add(obj); 
     } 
    } 
    public void registerClean(DomainObject obj) { 
     Assert.notNull("id not null", obj.getId()); 
    } 
+0

यह एक 3 स्तरीय ऐप है। हालांकि, हम चाहते हैं कि प्रत्येक उपयोगकर्ता परमाणु होने का अनुरोध करें, इसलिए 1 उपयोगकर्ता अनुरोध = 1 डीबी लेनदेन। मैं उपयोगकर्ता अनुरोध को संसाधित करूंगा, डोमेन ऑब्जेक्ट्स को संशोधित करूंगा, और फिर एनएचबीर्नेट से मेरी कुल रूट को जारी रखने के लिए कहूंगा। – ng5000

+0

यह एक पहचान मैप पर एक अमूर्त है। यह उपयोगी होता है जब आप फाउलर के पीओईए में वर्णित मैन्युअल डेटामैपिंग बनाते हैं, लेकिन एनएचबेर्नेट के साथ, क्योंकि पहचानमैप ISession में बनता है। – Paco

1

काम इंटरफ़ेस की मेरी बुनियादी इकाई निम्न विधियों शामिल हैं। यह उपयोगी है क्योंकि मुझे अलग-अलग सत्र स्कॉप्स के लिए बार-बार कोड लिखना नहीं है।(प्रति अनुरोध कार्य की इकाई, अनुरोधों की प्रति श्रृंखला, प्रति थ्रेड, आदि)

+0

क्या आप कोई उदाहरण पोस्ट कर सकते हैं? –

+0

किस तरह का उदाहरण? काम की इकाई या काम की इकाई का उपयोग कर? – Paco

+0

आपने विभिन्न सत्र क्षेत्रों से कैसे निपटारा? –

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

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