如何更新 SharePoint 中列表的 SPItemEventReceiver 程序集版本?
-
23-08-2019 - |
题
我们将 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更新、版本变更的事件该如何处理?
这些是我能想到的选项:
停用/重新激活功能 - 我会将更新的 dll 包装回 SharePoint 解决方案文件中,更改上面的代码以反映新版本,并使用 stsadmin 升级解决方案。然后我会停用/重新激活该功能。
将程序集重定向添加到 web.config。
不要更改 LabReportEventHandlers 版本号。
更改解决方案版本有什么对我有帮助的吗?
我认为这3个选项都存在问题:
停用该功能后,有人可以在我重新激活之前更新项目。
我不想手动编辑 web.config,所以我会使用 sharepoint API。我将在哪里运行该代码?
这完全是错误的,但却很简单。
解决方案
也许您可以将容易更改的逻辑封装到一个单独的程序集中,由您的事件处理程序引用和使用。这样,事件处理程序本身就不必更改,您只需将更新的“逻辑”程序集适当地部署到 GAC 或 bin 目录。
Hth,JT
其他提示
我不确定您想要升级什么,您是否希望将新的事件处理程序应用于旧列表或仅应用于新列表。
对于仅升级新列表,您可以将程序集信息放入单独的文件中,在 FeatureActivated 方法中读取该文件,然后应用新值。升级时,您所需要做的就是更新单独的配置文件,任何新的激活都将使用新的值和版本号。
如果您需要升级旧的事件处理程序,您可以执行类似的过程,但在删除旧的功能接收器之前添加新的功能接收器。如果您使用相同的方法执行此操作,则添加新处理程序和删除旧处理程序之间的时间将很短,并且任何人在该确切时间添加项目的机会接近于零。如果您想一直为零,则可以隐藏列表或使用额外的 ItemUpdated 事件处理程序来检查升级是否正在进行,如果是则停止更新。
所以,简而言之:对于新列表,请从外部文件中读取汇编以获取旧列表,请在删除旧处理程序之前添加升级的汇编信息。
.b
我仅在需要执行程序集的两个(旧版本和新版本)时才使用程序集版本控制。我在事件接收器上从来不需要这个。因此,我不会更改事件接收器的程序集版本。