2

我们有一个 SPItemEventReceiver 编译到它自己的程序集中。

我们正在使用 STSDev 将此 EventReceiver 作为一项功能打包一个 SharePoint 解决方案。我没有将 SPItemEventReceiver 分配给 elements.xml 中的特定 ListTemplateId,而是在 feature.xml 中链接一个 ReceiverAssembly 并以编程方式将 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,所以我会改用 sharepoint API。我将在哪里运行该代码?

  3. 这是完全错误的,但很容易。

4

3 回答 3

1

也许您可以将易于更改的逻辑封装到一个单独的程序集中,由您的事件处理程序引用和使用。这样,事件处理程序本身就不必更改,您只需将更新的“逻辑”程序集适当地部署到 GAC 或 bin 目录。

HTH, jt

于 2008-12-21T18:51:00.473 回答
0

我不确定您想要升级什么,是否要将新事件处理程序应用于旧列表或仅用于新列表。

对于仅升级新列表,您可以将程序集信息放在单独的文件中,在 FeatureActivated 方法中读取该文件,然后应用新值。升级时,您需要做的就是更新单独的配置文件,任何新的激活都将使用新的值和版本号。

如果您需要升级旧的事件处理程序,您可以执行类似的过程,但在删除旧的之前添加新的功能接收器。如果您以相同的方法执行此操作,则添加新处理程序和删除旧处理程序之间的时间将是最短的,并且任何人在该确切时间添加项目的机会接近于零。如果您想一直归零,您可以隐藏列表或使用额外的 ItemUpdated 事件处理程序来检查升级是否正在进行,如果是则停止更新。

所以,简而言之:对于新列表,从外部文件中读取程序集配置对于旧列表,在删除旧处理程序之前添加升级的程序集信息。

.b

于 2008-12-20T06:28:24.827 回答
0

如果需要执行程序集的(旧的和新的)版本,我只使用程序集版本控制。我在事件接收器上从来不需要这个。因此,我不会更改事件接收器的程序集版本。

于 2010-02-04T20:29:51.797 回答