2011-11-08 7 views
14

क्यों कुछ SharePoint उदाहरणSPSite साइट = नया SPSite (SPContext.Current.Web.Url) बनाम SPContext.Current.Web.Site

using (SPSite site = new SPSite(SPContext.Current.Web.Url)) 
{ 
    ... 
} 

और नहीं बस प्रयोग करते हैं?

SPSite site = SPContext.Current.Web.Site; 
... 

अद्यतन

मुझे लगता है कि मैं करने के लिए नीचे सवाल संकुचित है निम्नलिखित:

ऐसा लगता है कि मैं SPContent.Current सीधे उपयोग नहीं करना चाहिए, जब तक कि मैं कुछ कर रहा हूँ, मेरे कोड के अंदर चलता है कि शेयर बिंदु। लेकिन यह कब सच नहीं होगा?

+1

मुझ से एक समान प्रश्न पर एक नज़र डालें: http://sharepoint.stackexchange.com/questions/20192/उपयोग-spcontext-current-or-use-static-url –

+0

लिंक के लिए धन्यवाद। मैंने अपना प्रश्न अपडेट किया है। –

+1

बड़ी परियोजनाओं पर आपको कभी-कभी बाहरी उपयोगिताओं को SharePoint में नहीं चल रहा है। एक और उदाहरण यूनिट परीक्षण हैं जो शेयरपॉइंट में भी नहीं चलते हैं। यदि आप बस दृश्य वेबपर्टर विकसित कर रहे हैं और इकाई परीक्षण नहीं करते हैं - आपका कोड एसपी में चलता है। –

उत्तर

10

माइक्रोसॉफ्ट से disposing objects in SharePoint 2010 पर सर्वोत्तम अभ्यास प्रलेखन पर नज़र डालें, हालांकि opposing views हैं। हमेशा अपने SPWeb/SPSite वस्तुओं निपटाने

  • -> स्मृति लीक SPContext.Current की
  • उपयोग करें ... जब आप सुनिश्चित हैं:

    SharePoint परियोजनाओं के लिए कुछ महत्वपूर्ण परिणाम हैं अपने कोड एक SharePoint संदर्भ

    • यूनिट टेस्ट नहीं शेयरप्वाइंट संदर्भ
    • बाहरी उपयोगिताओं कोई शेयरप्वाइंट संदर्भ मतलब मतलब में चल रहा है
    • पावरहेल का मतलब कोई SharePoint संदर्भ नहीं है (उदा। सुविधा रिसीवर के साथ एक फीचर को सक्रिय करने में विफल हो सकता)
  • निपटाने मत SPContext.Current ... लेकिन अपनी खुद की वस्तु (फिर using)

आप के साथ अपने कई सपा problems with consistency हो सकता है बनाने के .. वस्तुओं ।

अंत में SPSite site = SPContext.Current.Web.Site; कुछ मामलों में ठीक है, लेकिन आपके पास इस site ऑब्जेक्ट पर नियंत्रण नहीं है - यह समस्या हो सकती है। यदि आप new SPSite(...) के लिए जाते हैं तो आपके पास हमेशा आपकेSPSite और आपके लिए कुछ SharePoint बनाया और प्रबंधित नहीं किया जाएगा।

व्यक्तिगत रूप से मैं लगभग using संरचना के लिए हमेशा जाता हूं ताकि सभी वस्तुओं को बाद में ठीक से निपटान किया जा सके। वैकल्पिक रूप से मैं बिना किसी निपटारे के SPContext.Current.Web का उपयोग करता हूं।

4

यह उस संदर्भ पर निर्भर करता है जिसमें आपका कोड चलता है। उदाहरण के लिए, यदि आप RunWithElevatedPrivileges ब्लॉक में चल रहे हैं तो आपको एक नया SPSite उदाहरण बनाना होगा।

0

डेनिस जी सही है। एसपीएससाइट/एसपीवेब/आदि का निपटान करना महत्वपूर्ण है लेकिन सुनिश्चित करें कि आप सीधे एपीआई द्वारा प्रदान की गई वस्तुओं को न निपटें। यह सूक्ष्म लेकिन महत्वपूर्ण है अन्यथा आपकी प्रतिक्रिया कभी भी उत्पन्न नहीं होगी या यहां तक ​​कि थ्रेड निरस्त स्थितियों का भी कारण बनती है। मेरे अनुभव में, यदि मुझे SPSite या SPWeb प्रॉपर्टी पर त्वरित जानकारी चाहिए, तो मुझे यकीन है कि उपयोगकर्ता संदर्भ (या तो सामग्री प्रबंधक अधिकृत उपयोगकर्ता या अज्ञात) के लिए उपलब्ध है, फिर SPContext.Current का उपयोग करें। * ऑब्जेक्ट बहुत अच्छा है।अन्यथा, RunWithElevatedPriveleges विधि का उपयोग अपने कोड रैप करने के लिए और कहा कि लैम्ब्डा के अंदर निम्नलिखित पैटर्न है:

SPSecurity.RunWithElevatedPrivileges(() => 
{ 
    using (SPSite site = new SPSite(SPContext.Current.Site.ID)) 
    { 
    using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID)) 
    { 
    // stuff goes here elevated 
    } 
    } 
}); 
संबंधित मुद्दे