Метод расширения, используемый для предотвращения событий элемента списка SharePoint справка

Я наткнулся на этот post с отличным решением проблемы предотвращения срабатывания приемника событий SPListItem при выполнении обновления извне приемника событий. Код работает на 100%, как описано, и я впечатлен решением, проблема в том, что я его не совсем понимаю.

Для простоты давайте проигнорируем методы SystemUpdate, поэтому мы имеем дело только с перегрузкой SPListItem.Update и частным классом, объявленным в коде.

Бит, который я не «понимаю», - это то, как класс rh «связан» или «связан» с элементом SPListItem. Воспроизведение метода сохранения, нажав назад ...

public static void Update(this SPListItem item, bool doNotFireEvents)
{
    SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
    if (doNotFireEvents)
    {
        try
        {
            rh.DisableEventFiring();
            item.Update();
        }
        finally
        {
            rh.EnableEventFiring();
        }
    }
    else
    {
        item.Update();
    }
}

Я вижу, что мы создаем экземпляр SPItemEventReceiverHandling, rh, и если doNotFireEvents истинно, мы вызываем DisableEventFiring () для rh, а затем, когда закончим, вызываем EnableEventFiring () для rh. Ссылка, которую я не вижу, находится между "rh" и "item". Как SharePoint «знает» использовать rh в качестве приемника событий при обновлении?

Надеюсь, я ясно это объяснил. Если нет, дайте мне знать, и я постараюсь уточнить дальше.


person Mark    schedule 07.04.2011    source источник


Ответы (2)


Код отключает все срабатывание событий для элементов, поэтому блок finally так важен (он снова включает его независимо от успеха обновления).

Документация: http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spitemeventreceiver_members(v=office.12).aspx

person theChrisKent    schedule 07.04.2011
comment
Хм, в документации нет ясности по этому поводу. Итак, когда вы говорите ‹i› all ‹/i›, о каком масштабе мы говорим? Это все события для этого пользователя? Нить? Веб-приложение? Или все фармят? Беспокойство заключается в том, что если это ферма для всех, то что, если кто-то другой сделает обновление, при котором я хочу, чтобы приемник событий срабатывал в короткие сроки, когда события отключены? - person Mark; 08.04.2011
comment
@Mark Он привязан к теме: sharepoint.stackexchange.com/questions/20261/ - person Alex; 24.07.2018

Я предполагаю, что это глобально отключает получение событий элемента. Я тоже не вижу, где создается ассоциация.

Интересно, пробовали ли люди, создавшие этот обходной путь, это при одновременном обновлении элементов. Если SharePoint делает это для каждого запроса (глобально для запроса, но не для экземпляра SharePoint), то это, вероятно, будет относительно безопасно.

Эти методы были отмечены как устаревший API в документации по SharePoint 2010.

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

person Dave White    schedule 07.04.2011