イベント レシーバーで推奨されている方法

最終更新日: 2010年1月13日

適用対象: SharePoint Foundation 2010

このトピックでは、イベント レシーバーの効率的な使用に関連する一般的な問題を説明します。

イベント レシーバーにおけるオブジェクトの使用

イベント レシーバー内で、SPWeb、SPSite、SPList、SPListItem の各オブジェクトをインスタンス化しないでください。イベント レシーバーで、イベント プロパティを介して渡されたインスタンスを使用する代わりに、これらのオブジェクトをインスタンス化すると、次の問題が発生する可能性があります。

  • データベースへの往復回数の増大 (1 回の書き込み操作によって各イベント レシーバーで最高 5 回の追加的な往復が生じる)。

  • これらのインスタンスで 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 を呼び出すとき、それを SPEventPropertiesBase の適切な子クラス (たとえば、SPItemEventProperties.InvalidateListItem または SPItemEventProperties.InvalidateWeb) の Invalidate メソッドでクリアする必要があります。