2013-02-12 17 views
6

मैं .NET के System.DirectoryServices.AccountManagement नामस्थान के साथ कुछ सक्रिय निर्देशिका कार्य कर रहा हूं। मैंने देखा कि PrincipalIDisposable लागू करता है, जो उस नामस्थान में में सब कुछ से सिरदर्द का कारण बनता है।क्या मुझे वास्तव में प्रत्येक प्रिंसिपल पर निपटान() को कॉल करने की आवश्यकता है?

उदा। निम्नलिखित कोड किसी समूह के सभी उपयोगकर्ताओं को पाने के लिए पर विचार करें:

PrincipalContext domain = new PrincipalContext(ContextType.Domain); 
GroupPrincipal group = GroupPrincipal.FindByIdentity(domain, "MyGroup"); 
PrincipalSearchResult<Principal> users = group.GetMembers(); 

कि स्निपेट में हर एक प्रकार लागू करता IDisposable, सभी उपयोगकर्ताओं खोज और खोज ही सेट परिणाम द्वारा दिया भी शामिल है। नहीं domain और group वस्तुओं की

निपटान किया जाता है एक बड़ी बात (यह एक using() ब्लॉक के साथ आसान होगा), लेकिन मैं के बारे में हर परिणाम क्या करते हैं? क्या मुझे वास्तव में उस users संग्रह के माध्यम से लूप करना है और हर किसी का निपटान करना है?

+0

एफडब्ल्यूआईडब्ल्यू, [ग्रुप प्रिंसिपल.गेटमेम्बर] (http://msdn.microsoft.com/en-us/library/bb339975.aspx) केवल समूह को डिस्पोजेड दिखाता है। मुझे कोई दस्तावेज नहीं मिला है (अभी तक) जो "सदस्य जीवनकाल स्वामित्व" के इस अनुबंध को स्पष्ट रूप से बताता है: +1 क्योंकि मुझे यह विशेष अनुबंध (या शायद इसकी कमी), दिलचस्प लगता है। हालांकि, यहां मेरा [आईडीस्पोजेबल अनुबंध पर सामान्य दृश्य] है (http://stackoverflow.com/a/14781766/166390)। –

+2

यहां एक उत्तर है जो मदद कर सकता है: http://stackoverflow.com/a/14627265/2258 –

उत्तर

4

IDisposable अनुबंध केवल एक अनुबंध है। इसका पालन किया जाने की उम्मीद है। वे कार्यान्वित नहीं हो अनुबंध किया तुम नहीं "निपटान कॉल करने के लिए की जरूरत है" ...

हकीकत में, तुम सच में नहीं बता सकता वस्तु की किस प्रकार कभी कभी Principal की एक विशेष उदाहरण द्वारा किया जा रहा है, तो आप को इसे निपटाना है, कभी-कभी आप नहीं करते हैं। आपके पास वास्तव में रनटाइम पर कहने का कोई तरीका नहीं है जब तक कि आप Principal के किसी विशेष कार्यान्वयन के कुछ आंतरिकों को नहीं जानते। उदाहरण के लिए, यदि सिद्धांत उदाहरण में अंतर्निहित वस्तु DirectoryEntry है, तो आपको इसका निपटान करना चाहिए। लेकिन, आपके पास रन टाइम पर बताने का वास्तविक तरीका नहीं है कि अंतर्निहित वस्तु क्या है। भले ही आप कर सकें, तो Dispose पर कॉल करना आसान लगेगा।

+2

ठीक है, मुझे पता है कि सबकुछ निपटान करने की आवश्यकता है। मुझे लगता है कि यह उलझन में है कि मैं "प्रभारी" हूं। मेरी सामान्य धारणा यह है कि यदि मैं किसी ऑब्जेक्ट को तुरंत चालू करता हूं तो मैं इसे साफ़ करने के लिए ज़िम्मेदार हूं, लेकिन यह स्पष्ट रूप से इन वर्गों पर लागू नहीं होता है। एमएसडीएन दस्तावेज़ पूरी तरह से अनुपयोगी हैं: उनके अधिकांश नमूने में 'निपटान()' कॉल नहीं है। –

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

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