[.net] LinqToSql सबसे अच्छा अभ्यास DataContext घोषित और इन्स्तांत?



Answers

जैसा कि रेक्स एम ने कहा , डेटाकॉन्टेक्स्ट का इरादा है कि प्रत्येक तार्किक लेन-देन के लिए तत्काल उपयोग किया जाए, और इसका निपटारा किया जाए। इस तरह के पैटर्न को कभी-कभी "काम की इकाई" कहा जाता है

ऐसा करने के लिए सबसे आम तरीका (मुझे पता है) एक प्रयोग ब्लॉक में अपने डेटाकॉन्टेक्स्ट को इन्स्तांत करना है। मैंने थोड़ी देर में वीबी इस्तेमाल नहीं किया है, लेकिन ऐसा कुछ दिखना चाहिए:

Using dc As New MyDataContext()
   user = (From u in dc.Users Where u.ID = UserID).Single()
End Using

यह न केवल कार्य के लेन-देन / इकाई (कोड के भौतिक आकार के माध्यम से) के नज़रिए को पुष्ट करता है, लेकिन यह ब्लॉक समाप्त होने पर आपके डेटाकॉन्टेक्स्ट पर विवाद () को कॉल करने के लिए सुनिश्चित करता है।

यह एमएसडीएन पृष्ठ देखें:

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

Question

मेरे विस्तारित LinqToSql वर्गों में आसान पहुंच के लिए मेरे डेटाकॉन्टेक्स्ट की स्थापना के मामले में सबसे अच्छा अभ्यास क्या है?

उदाहरण के लिए, मेरे पास मेरे डीबीएमएल में एक "उपयोगकर्ता" इकाई है और मैं इस तरह से उस वर्ग के तरीकों को जोड़ना चाहता हूं:

Partial Public Class User

    Public Function GetUser(ByVal UserID as Integer) as User
         'Do Work
    End Function

End Class

मेरे डेटाकॉन्टेक्स्ट तक पहुंचने के लिए मुझे इसे इस तरह की विधि के अंदर घोषित करना होगा:

Partial Public Class User

    Public Function GetUser(ByVal UserID as Integer) as User
         Dim dc as New MyDataContext()
         Return (From u in dc.Users Where u.ID = UserID).Single()
    End Function

End Class

मुझे हर विधि के लिए ऐसा करना नहीं है। आम तौर पर (यदि मैं LinqToSql डीबीएमएल वर्गों का विस्तार नहीं कर रहा था) तो मैं यह कर सकता था:

Partial Public Class User
    Private dc as MyDataContext

    Public Sub New()
         dc = new MyDataContext()
    End Sub

    Public Function GetUser(ByVal UserID as Integer) as User
         Return (From u in dc.Users Where u.ID = UserID).Single()
    End Function

    Public Function GetAllUsers() as IEnumerable(Of User)
         Return From u in dc.Users
    End Function

    'etc...

End Class

इससे मुझे प्रत्येक पद्धति को हर बार नया घोषित किए बिना प्रत्येक विधि के लिए डेटाकॉन्टेक्स्ट तक पहुंचने की अनुमति मिल जाएगी। लेकिन निश्चित रूप से आप ऐसा नहीं कर सकते क्योंकि dbml पहले से ही एक कन्स्ट्रक्टर है। अगर डीबिल में कोड जोड़ता है तो हमेशा अधिलेखित हो जाता है, अगर कुछ भी बदल जाता है

किसी को भी कैसे अपने आप को कुछ अतिरिक्त कोड को बचाने के बारे में कोई अच्छा विचार है?

TIA!




कुछ अलग तरीके हैं जो आप इस बारे में जा सकते हैं जो अच्छा अभ्यास होगा, मुझे लगता है। पहले आप एक रिपॉज़िटरी पैटर्न का उपयोग कर सकते हैं, जहां आप एक वस्तु के लिए रिपॉजिटरी से पूछते हैं, यह डाटाबेस में जाता है, ऑब्जेक्ट को पुनः प्राप्त करता है - संभवतः डेटा संदर्भ से इसे अलग कर सकता है या डेटा प्राप्य को रखकर रिपॉजिटरी के कार्यान्वयन के आधार पर रखता है - और इसे आपको वापस लाता है आपके ऑब्जेक्ट्स के लिए कारखाने के तरीके रिपोजिटरी पर होंगे, न कि संस्थाएं स्वयं। आप शायद लागू करने के लिए अपने तरीकों की संख्या को कम करने के लिए प्रतिबिंब और जेनेरिक का उपयोग करें और अपना कोड DRY रखें।

दूसरी तरह से, और जिस तरह से LINQtoSQL को आईएमएचओ ने मूल रूप से इस्तेमाल करने का इरादा किया था, वह डाटाबेस परिचालन के प्रत्येक सेट के लिए डाटा संदर्भ बनाने के लिए है, जिसे आप प्रदर्शन करना चाहते हैं इस में डेटा संदर्भ का निर्माण इकाई के बाहर भी होता है, आम तौर पर उन वर्गों में होता है जो संस्थाओं का उपयोग कर रहा है, डेटा स्तर में बिल्कुल नहीं। आप डेटा संदर्भ में तरीकों को भी जोड़ सकते हैं - अपनी वास्तविक डेटा संदर्भ को सार बना सकते हैं और इसे से प्राप्त कर सकते हैं - फिर से प्रतिबिंब का उपयोग करके, कुछ सामान्य पुनर्प्राप्ति कार्यों को पूरा करने के लिए ताकि आपको उन्हें दोहराना नहीं पड़े। संभवत: आपको एक डाटाबेस पैटर्न का उपयोग करना होगा जैसे कि ActiveRecords जहां आईडी कॉलम हमेशा इस काम को बनाने के लिए समान नाम रखते हैं।

दूसरी तरफ, आप उपरोक्त में से किसी एक को अपने स्वयं के समाधान की नकल करने के बजाय nHibernate या Castle के ActiveRecord का उपयोग करने पर गौर कर सकते हैं




Links