пятница, 27 июля 2012 г.

Исследование Event Receiver SharePoint 2010. Часть первая

Давно не писал постов, был занят проектами.

А данной серии постов я хочу рассказать об Event Receiver (Обработчики событий) для элементов списка и их интересные возможности.

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

Хочу привести небольшую таблицу свойств обработчиков.


СписокBeforePropertiesAfterPropertiesproperties.ListItem
ItemAddingПустоНовые значенияnull
ItemAddedПустоНовые значенияНовые значения
ItemUpdatingПустоНовые значенияСтарые значения
ItemUpdatedПустоНовые значенияНовые значения
ItemDeletingПустоПустоСтарые значения
ItemDeletedПустоПустоnull

БиблиотекаBeforePropertiesAfterPropertiesproperties.ListItem
ItemAddingПустоПустоnull
ItemAddedПустоПустоНовые значения
ItemUpdatingСтарые значенияНовые значенияСтарые значения
ItemUpdatedСтарые значенияНовые значенияНовые значения
ItemDeletingПустоПустоСтарые значения
ItemDeletedПустоПустоnull

 * Источник


Сегодня я хочу описать один небольшой сценарий привязки обработчиков на конкретный список или библиотеку.

Если у вас Feature типа Scope="Site", то при создании обработчика он будет постоянно срабатывать вне зависимости привязали вы его к конкретному списку или шаблону списка.
На деле это особо не заметно, а вот при очень высокой тенденции работы с вашим сайтом это сразу же будет съедать какое-то производительности. Если у вас на сайте стоит показ панель разработчика это станет очевидно.

После создания и отладки обработчика, я проводил долгую отладку кода, при этом меня сразу насторожило, что он постоянно срабатывает и валится и только когда он начинает работать из конкретного списка и с конкретным элементом работает исправно. Радостно что с опытом пишешь более работоспособный код и сразу его адаптируешь, а вот что насторожило что он отработывает постоянно и на всех списках при этом я привезал его в конкретному списку.
И после долгого серфинга по интернетам, для меня стало очевидно, что в контексте Scope="Site", обработчик всегда работает на весь сайт и его никак не привезать к конкретному списку, только если в самом коде не проверять с какого списка идет обращение (не Best Practise).

В итоге как я решил эту проблему просто и без всяческих танцев:

Я создал дополнительную feature типа Scope="Web" и в моем обработчике изменил строчку на

<Receivers ListUrl="{URL списка}" Scope="Web">

И теперь я точно уверен, что мой обработчик всегда работает только в рамках моего списка.

При разработки features для MS SharePoint 2010, я всегда использую Scope="Site".

Комментариев нет:

Отправить комментарий