我们将 SPItemEventReceiver 编译到其自己的程序集中。

我们正在使用 STSDev 来打包 SharePoint 解决方案,并将此 EventReceiver 作为一项功能。我没有将 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. 这完全是错误的,但却很简单。

有帮助吗?

解决方案

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

Hth,JT

其他提示

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

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

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

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

.b

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top