我们有一个 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 更新,版本发生变化,我应该如何处理?
这些是我能想到的选项:
停用/重新激活功能——我会将更新后的 dll 包装回 SharePoint 解决方案文件,更改上面的代码以反映新版本,然后使用 stsadmin 升级解决方案。然后我会停用/重新激活该功能。
将程序集重定向添加到 web.config。
不要碰撞 LabReportEventHandlers 版本号。
更改解决方案版本是否对我有帮助?
我认为这3个选项存在问题:
停用该功能后,有人可以在我重新激活之前更新项目。
我不想手动编辑 web.config,所以我会改用 sharepoint API。我将在哪里运行该代码?
这是完全错误的,但很容易。