2011-11-08 23 views
14

爲什麼有些例子的SharePoint使用的SPSite網站=新的SPSite(SPContext.Current.Web.Url)VS SPContext.Current.Web.Site

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

,並不能簡單?

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

更新

我想我已經縮小問題到以下幾點:

看來,我不應該直接使用SPContent.Current,除非我確信,我的代碼中運行SharePoint中。但是,這是不是真的?

+1

看看從我類似的問題:http://sharepoint.stackexchange.com/questions/20192/using-spcontext-current-or-using-static-url –

+0

感謝您的鏈接。我更新了我的問題。 –

+1

在較大的項目中,您有時會遇到不在SharePoint中運行的外部實用程序。另一個例子是單元測試,它也不能在SharePoint中運行。如果您只是開發可視化Web部件而不進行單元測試 - 您的代碼將在SP中運行。 –

回答

10

查看來自Microsoft的disposing objects in SharePoint 2010的最佳做法文檔,但有opposing views

有針對SharePoint項目的幾個關鍵外賣:

  • 始終處置的SPWeb/SPSite的對象 - >內存泄漏
  • 。利用SPContext.Current的...當你確定你的代碼是在SharePoint方面
    • 單元測試是指在SharePoint方面
    • 外部公用事業意味着在SharePoint環境中運行
    • Powershell意味着沒有SharePoint上下文(例如,激活功能,以功能接收器可能會失敗)
  • 不處置SPContext.Current ...但創建自己的對象(再次using

你可能有problems with consistency與多個SP ..對象。

最後SPSite site = SPContext.Current.Web.Site;在某些情況下沒問題,但您無法控制此site對象 - 可能是問題所在。如果你去尋找new SPSite(...),你將永遠有你的SPSite而不是SharePoint爲你創建和管理的東西。

就我個人而言,我幾乎總是會選擇using結構,以便所有對象都可以正確放置。或者我使用SPContext.Current.Web而不處置。

4

它取決於您的代碼運行的上下文。例如,如果您在RunWithElevatedPrivileges塊中運行,則需要創建一個新的SPSite實例。

0

丹尼斯G是正確的。處理SPSite/SPWeb/etc很重要,但要確保不要直接處理由API提供給您的對象。它很微妙但很重要,否則你的響應永遠不會產生,甚至會導致線程中止情況。 根據我的經驗,如果我需要有關用戶上下文(內容管理員授權用戶或匿名用戶)可用的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 
    } 
    } 
}); 
相關問題