Как обновить версию сборки SPItemEventReceiver для списка в SharePoint?
У нас есть SPItemEventReceiver, скомпилированный в его собственную сборку.
Мы используем STSDev для упаковки решения SharePoint с этим EventReceiver в качестве функции. Я не назначаю SPItemEventReceiver определенному ListTemplateId в elements.xml, а вместо этого связываю ReceiverAssembly в feature.xml и программно назначаю SPItemEventReceiver нескольким элементам SPList.
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
foreach (SPWeb web in site.AllWebs)
{
SPListCollection webListCollection = web.Lists;
foreach (SPList myList in webListCollection)
{
if (myList.Title == "Lab Reports")
{
SPEventReceiverDefinitionCollection receivers = myList.EventReceivers;
SPEventReceiverDefinition receiver = receivers.Add();
receiver.Name = "PostUpdateLabReport";
receiver.Assembly = "LabReportEventHandlers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1111111111111";
receiver.Class = "LabReportEventHandlers.LabReportsHandler";
receiver.Type = SPEventReceiverType.ItemUpdated;
receiver.Update();
break;
}
}
web.Dispose();
}
}
Я использую FeatureDeactivating, чтобы сделать обратный код выше, удаляя EventReceiver из списков.
Вопрос:
Как я должен обрабатывать будущее событие, когда LabReportEventHandlers обновляется и изменяется версия?
Вот варианты, которые я могу придумать:
Функция деактивации / повторной активации - я бы поместил обновленную dll обратно в файл решения SharePoint, изменил код выше, чтобы отразить новую версию, и использовал stsadmin для обновления решения. Затем я бы деактивировал / активировал эту функцию.
Добавьте перенаправление сборки в файл web.config.
Не повышайте номер версии LabReportEventHandlers.
Есть ли что-то в изменении версии решения, которая поможет мне?
Я думаю, что есть проблемы с 3 вариантами:
После деактивации функции кто-то может обновить элемент, прежде чем я смогу снова его активировать.
Я не хотел бы редактировать web.config вручную, поэтому вместо этого я бы использовал API sharepoint. Где бы мне запустить этот код?
Это просто неправильно, но легко.
3 ответа
Возможно, вы можете заключить логику, которая склонна к изменению, в отдельную сборку, на которую ссылается и использует ваш обработчик событий. Таким образом, сам обработчик событий не изменится, его нужно будет изменить, вы только развернете обновленную "логическую" сборку в каталог (ы) GAC или bin соответствующим образом.
HTH, JT
Я использую управление версиями сборки только в том случае, если необходимо выполнить обе (старые и новые) версии сборки. Мне никогда не нужно это на приемнике событий. Поэтому я не изменяю версию сборки для получателей событий.
Я не уверен, что вы хотите с обновлением, хотите ли вы, чтобы новый обработчик событий применялся к старым спискам или просто для новых списков.
Для обновления только новых списков вы можете поместить информацию о сборке в отдельный файл, прочитать этот файл в методе FeatureActivation и применить новые значения. При обновлении все, что вам нужно сделать, это обновить отдельный файл конфигурации, и любая новая активация будет использовать новые значения и номера версий.
Если вам нужно обновить старые обработчики событий, вы можете выполнить аналогичную процедуру, но добавьте новый приемник функций, прежде чем удалять старые. Если вы сделаете это одним и тем же способом, время между добавлением нового обработчика и удалением старого будет минимальным, и вероятность того, что кто-либо добавит элемент в это точное время, будет близка к нулю. Если вы хотите полностью перейти к нулю, вы можете скрыть список или иметь дополнительный обработчик события ItemUpdated, который проверяет, выполняется ли обновление, и если это так, останавливает обновление.
Итак, вкратце: для новых списков прочитайте конфигурацию сборки из внешнего файла. Для старых списков добавьте обновленную информацию о сборке непосредственно перед удалением старого обработчика.
.b