Как обновить версию сборки SPItemEventReceiver для списка в SharePoint? - PullRequest
1 голос
/ 20 декабря 2008

У нас есть 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 ]

1 голос
/ 21 декабря 2008

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

НТН, JT

0 голосов
/ 04 февраля 2010

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

0 голосов
/ 20 декабря 2008

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

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

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

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

.b

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...