Как обновить версию сборки 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 обновляется и изменяется версия?

Вот варианты, которые я могу придумать:

  1. Функция деактивации / повторной активации - я бы поместил обновленную dll обратно в файл решения SharePoint, изменил код выше, чтобы отразить новую версию, и использовал stsadmin для обновления решения. Затем я бы деактивировал / активировал эту функцию.

  2. Добавьте перенаправление сборки в файл web.config.

  3. Не повышайте номер версии LabReportEventHandlers.

Есть ли что-то в изменении версии решения, которая поможет мне?

Я думаю, что есть проблемы с 3 вариантами:

  1. После деактивации функции кто-то может обновить элемент, прежде чем я смогу снова его активировать.

  2. Я не хотел бы редактировать web.config вручную, поэтому вместо этого я бы использовал API sharepoint. Где бы мне запустить этот код?

  3. Это просто неправильно, но легко.

3 ответа

Решение

Возможно, вы можете заключить логику, которая склонна к изменению, в отдельную сборку, на которую ссылается и использует ваш обработчик событий. Таким образом, сам обработчик событий не изменится, его нужно будет изменить, вы только развернете обновленную "логическую" сборку в каталог (ы) GAC или bin соответствующим образом.

HTH, JT

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

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

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

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

Итак, вкратце: для новых списков прочитайте конфигурацию сборки из внешнего файла. Для старых списков добавьте обновленную информацию о сборке непосредственно перед удалением старого обработчика.

.b

Другие вопросы по тегам