2009-05-04 8 views
2

Lors de l'écriture de composants WebPart dans SharePoint, implémentez-vous IDisposable via une clause using? Ou, disposez-vous de vos objets au try/catch/finally? Tous les deux? Dépend? Pourquoi avez-vous choisi l'un sur l'autre?Utilisation de jetons avec des objets SharePoint (composants WebPart)

Contexte:

Je travaille sur un morceau de code hérité qui ne met pas en œuvre IDisposable, donc je l'ai lu pour corriger le problème. MSDN a un bel article portant sur la « meilleure pratique »:

http://msdn.microsoft.com/en-us/library/aa973248.aspx

qui recommande using, mais poursuit en disant que, dans de nombreux cas, il est conseillé de ne pas être en utilisant using.

Répondre

5

Je peux comprendre la abiguity dans l'article - la vraie réponse est aussi clair que la boue :)

En ce qui concerne la partie développement web (ou le développement avec l'API SharePoint en général), l'élimination de certains objets (spécifiquement, les objets SPOM) produiront des résultats imprévisibles si vous n'instanciez pas vos objets correctement. En particulier, si vous obtenez une référence d'objet au SPSite ou au SPWeb du contexte actuel et que vous tentez d'en disposer (avec une clause using ou try/finally), vous obtiendrez une erreur de référence d'objet de la part de SharePoint empiler. La meilleure façon de disposer de vos objets SP (SPSite, SPWeb, etc) est d'instancier un nouvel objet SP (plutôt que d'utiliser le contexte pour l'obtenir) à partir d'un site utilisant une URL. Par exemple:

using (SPSite siteCollection = new SPSite("http://your_site_url")) 
{ 
    using (SPWeb site = siteCollection.OpenWeb("News")) 
    { 
    //do stuff with your news web 
    } 
} 

Voici un exemple de code qui génère une erreur de référence d'objet si vous tentez de l'utiliser:

using(contextSite = SPControl.GetContextSite(Context)) 
{ 
    using (SPWeb site = siteCollection.OpenWeb("News")) 
    { 
    //do stuff with your news web 
    } 
} 

L'erreur ne se produira pas pendant le bloc à l'aide, mais se produire plus tard en aval lorsque SharePoint essaie de faire quelque chose en interne avec le site.

En termes d'utilisation générale, je suis un grand fan de using() over try/enfin si vous avez un objet IDisposable. La seule fois où j'opte pour try/finally, c'est si j'ai besoin de faire une logique supplémentaire pour désallouer des objets non-IDisposables.

Espérons que cela aide!

+0

(+1) C'est certainement moins boueux maintenant, merci! – vinny

Questions connexes