web-dev-qa-db-fra.com

Site SPSite = nouveau SPSite (SPContext.Current.Web.Url) vs SPContext.Current.Web.Site

Pourquoi certains exemples SharePoint utilisent-ils

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

et pas simplement?

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

Mettre à jour

Je pense avoir réduit la question à la suivante:

Il semble que je ne devrais pas utiliser SPContent.Current directement, sauf si je suis certain, que mon code s'exécute dans SharePoint. Mais quand cela ne serait-il pas vrai?

14
Jan Aagaard

Jetez un coup d'œil à la documentation sur les meilleures pratiques concernant la disposition d'objets dans SharePoint 2010 de Microsoft, mais il existe des vues opposées .

Il existe quelques points à retenir pour les projets SharePoint:

  • Jetez toujours vos objets SPWeb/SPSite -> fuites de mémoire
  • Utilisez SPContext.Current ... lorsque vous êtes sûr que votre code s'exécute dans un contexte SharePoint
    • Les tests unitaires ne signifient aucun contexte Sharepoint
    • Les utilitaires externes ne signifient aucun contexte SharePoint
    • Powershell ne signifie aucun contexte SharePoint (par exemple, l'activation d'une fonctionnalité avec le récepteur de fonctionnalité peut échouer)
  • Ne supprimez pas SPContext.Current ... mais créez votre propre objet (à nouveau using)

Vous pourriez avoir des problèmes de cohérence avec vos multiples objets SP ...

À la fin, SPSite site = SPContext.Current.Web.Site; convient dans certains cas, mais vous n'avez pas le contrôle sur cet objet site - cela pourrait être le problème. Si vous optez pour new SPSite(...), vous aurez toujours votreSPSite et pas quelque chose que SharePoint aura créé et géré pour vous. 

Personnellement, je choisis presque toujours la structure using pour que tous les objets soient ensuite correctement disposés. Sinon, j'utilise SPContext.Current.Web sans disposer.

10
Dennis G

Cela dépend du contexte dans lequel votre code est exécuté. Par exemple, vous devez créer une nouvelle instance SPSite si vous vous exécutez dans un bloc RunWithElevatedPrivileges.

4

Dennis G a raison. Supprimer le SPSite/SPWeb/etc est important, mais veillez à ne pas supprimer les objets qui vous sont fournis directement par l'API. C’est subtile mais critique sinon votre réponse ne sera jamais générée ni même provoquera des situations d’abandon de threads ..__ Selon mon expérience, si j’ai besoin d’informations rapides sur la propriété SPSite ou SPWeb que je suis sûr de pouvoir mettre à la disposition du contexte utilisateur (un gestionnaire de contenu), utilisateur autorisé ou anonyme), l'utilisation de l'objet SPContext.Current. * est excellente. Sinon, utilisez la méthode RunWithElevatedPriveleges pour envelopper votre code et lambda présente le modèle suivant:

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
Roman