SPSite site = new SPSite(SPContext.Current.Web.Url) vs SPContext.Current.Web.Site

后端 未结 3 1306
旧巷少年郎
旧巷少年郎 2021-02-02 15:17

Why do some SharePoint examples use

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

and not just simply?



        
相关标签:
3条回答
  • 2021-02-02 16:10

    Take a look at the best practices documentation on disposing objects in SharePoint 2010 from Microsoft, however there are opposing views.

    There are a few key takeaways for SharePoint projects:

    • Always dispose your SPWeb / SPSite objects --> memory leaks
    • Make use of SPContext.Current... when you are sure your code is running in a SharePoint context
      • Unit Tests mean no Sharepoint context
      • External utilities mean no Sharepoint context
      • Powershell means no SharePoint context (e.g. activating a feature with feature receiver might fail)
    • Do not dispose SPContext.Current... but create your own object (again using)

    You might have problems with consistency with your multiple SP.. objects.

    In the end SPSite site = SPContext.Current.Web.Site; is fine in some instances, but you do not have control over this site object - that might be the problem. If you go for new SPSite(...) you will always have your SPSite and not something SharePoint created and managed for you.

    Personally I almost always go for the using structure so all objects are disposed properly afterwards. Alternatively I use SPContext.Current.Web without disposing.

    0 讨论(0)
  • 2021-02-02 16:18

    Dennis G is correct. Disposing the SPSite/SPWeb/etc is important but make sure you do not dispose the objects that are provided to you by the API directly. It's subtle but critical otherwise your response will never get generated or cause even thread abort situations. In my experience, if I need quick information on the SPSite or SPWeb property that I am sure available to the user context (either a content manager authorized user or anonymous), then using SPContext.Current.* object is great. Otherwise, use the RunWithElevatedPriveleges method to wrap your code and inside that lambda has the following pattern:

    SPSecurity.RunWithElevatedPrivileges(() =>
    {
      using (SPSite site = new SPSite(SPContext.Current.Site.ID))
      {
        using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID))
        {
         // stuff goes here elevated
        }
      }
    });
    
    0 讨论(0)
  • 2021-02-02 16:21

    It depends on the context in which your code runs. For instance, you need to create a new SPSite instance if you are running within a RunWithElevatedPrivileges block.

    0 讨论(0)
提交回复
热议问题