Поделиться через


Рекомендации по работе с приемниками событий

Дата последнего изменения: 13 января 2010 г.

Применимо к: SharePoint Foundation 2010

В данной статье рассматриваются типичные ошибки, связанные с эффективным использованием приемников событий.

Использование объектов в приемниках событий

Не создавайте экземпляры объектов SPWeb, SPSite, SPList или SPListItem в приемниках событий. Приемники событий, в которых созданы экземпляры этих объектов, вместо использования экземпляров, переданных в свойствах события, могут вызвать следующие проблемы:

  • Значительные дополнительные обращения в базу данных (одна операция записи может вызвать до пяти дополнительных обращений в каждом приемнике событий).

  • Вызовы метода Update в этих экземплярах могут привести к сбою последующих вызовов Update в других зарегистрированных приемниках событий.

Пример неправильного написания кода

Создание экземпляра объекта SPSite в приемнике событий

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

Рекомендуемый прием написания кода

Использование 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.

Если не получать объекты SPWeb, SPSite, SPList или SPListItem от SPItemEventProperties и вместо этого создать экземпляр этих объектов в приемнике событий, при вызове Update в новых экземплярах необходимо очистить их с помощью метода Invalidate в соответствующем дочернем классе объекта SPEventPropertiesBase (например, SPItemEventProperties.InvalidateListItem или SPItemEventProperties.InvalidateWeb).