Bonnes pratiques en matière de récepteurs d’événements
Dernière modification : mercredi 13 janvier 2010
S’applique à : SharePoint Foundation 2010
Cette rubrique aborde les problèmes courants liés à l’utilisation efficace des récepteurs d’événements.
Utilisation d’objets dans des récepteurs d’événements
N’instanciez pas un objet SPWeb, SPSite, SPList ou SPListItem dans un récepteur d’événements. Les récepteurs d’événements qui instancient ces objets au lieu d’utiliser les instances transmises via les propriétés d’événement peuvent entraîner les problèmes suivants :
Un nombre nettement plus élevé d’allers-retours à la base de données (une seule opération d’écriture peut entraîner jusqu’à cinq allers-retours supplémentaires dans chaque récepteur d’événements).
Les appels à la méthode Update sur ces instances peuvent entraîner l’échec des appels ultérieurs Update dans d’autres récepteurs d’événements enregistrés.
Mauvaise pratique de programmation
Instanciation d’un objet SPSite à l’intérieur d’un récepteur d’événements
public override void ItemDeleting(SPItemEventProperties properties)
{
using (SPSite site = new SPSite(properties.WebUrl))
{
using (SPWeb web = site.OpenWeb())
{
SPList list = web.Lists[properties.ListId];
SPListItem item = list.GetItemByUniqueId(properties.ListItemId);
// Operate on an item.
}
}
}
Public Overrides Sub ItemDeleting(ByVal properties As SPItemEventProperties)
Using site As New SPSite(properties.WebUrl)
Using web As SPWeb = site.OpenWeb()
Dim list As SPList = web.Lists(properties.ListId)
Dim item As SPListItem = list.GetItemByUniqueId(properties.ListItemId)
' Operate on an item.
End Using
End Using
End Sub
Bonne pratique de programation
Utilisation de SPItemEventProperties
// Retrieve SPWeb and SPListItem from SPItemEventProperties instead of
// from a new instance of SPSite.
SPWeb web = properties.OpenWeb();
// Operate on the SPWeb object.
SPListItem item = properties.ListItem;
// Operate on an item.
' Retrieve SPWeb and SPListItem from SPItemEventProperties instead of
' from a new instance of SPSite.
Dim web As SPWeb = properties.OpenWeb()
' Operate on the SPWeb object.
Dim item As SPListItem = properties.ListItem
' Operate on an item.
Si vous ne récupérez pas les objets SPWeb, SPSite, SPList, SPListItem ou SPItemEventProperties et instanciez ces objets dans un récepteur d’événements, lorsque vous appelez Update sur les nouvelles instances, vous devez l’effacer avec la méthode Invalidate dans la classe enfant appropriée de SPEventPropertiesBase (par exemple, SPItemEventProperties.InvalidateListItem ou SPItemEventProperties.InvalidateWeb).