Share via


Bewährte Methoden für Ereignisempfänger

Letzte Änderung: Mittwoch, 13. Januar 2010

Gilt für: SharePoint Foundation 2010

In diesem Thema werden allgemeine Probleme im Zusammenhang mit der effizienten Verwendung von Ereignisempfängern besprochen.

Verwenden von Objekten in Ereignisempfängern

Instanziieren Sie keine SPWeb, SPSite-, SPList- oder SPListItem-Objekte in einem Ereignisempfänger. Ereignisempfänger, die diese Objekte instanziieren, anstatt die über die Ereigniseigenschaften übergebenen Instanzen zu verwenden, können die folgenden Probleme verursachen:

  • Deutlich häufigere Roundtrips zur Datenbank (ein Schreibvorgang kann bis zu fünf zusätzliche Roundtrips in einem einzelnen Ereignisempfänger zur Folge haben).

  • Aufrufe der Update-Methode für diese Instanzen können dazu führen, dass nachfolgende Update-Aufrufe in anderen registrierten Ereignisempfängern fehlerhaft ausgeführt werden.

Beispiel für schlechten Code

Instanziieren eines SPSite-Objekts in einem Ereignisempfänger

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

Beispiel für guten Code

Verwenden von 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.

Wenn Sie SPWeb-, SPSite, SPList- oder SPListItem-Objekte nicht aus SPItemEventProperties abrufen und diese Objekte anstelle dessen in einem Ereignisempfänger instanziieren, müssen Sie ihn beim Aufrufen von Update für die neuen Instanzen mithilfe der Invalidate-Methode in der entsprechenden untergeordneten Klasse von SPEventPropertiesBase (z. B. SPItemEventProperties.InvalidateListItem oder SPItemEventProperties.InvalidateWeb) leeren.