无法将处理程序添加到某些 Sitecore 事件

Can't add handlers to certain Sitecore events

我正在使用 Sitecore 8 Update 2。 我想收集有关 Sitecore 项目(创建、保存、删除、发布等)发生的情况的信息。

为了实现这一点,我为各自的事件设置了多个事件处理程序。所有 sitecore 事件都位于配置下的配置中 --> sitecore -> events.

在这里,我能够向 "item:added"、"item:saved" 和 "publish:complete" 等事件添加处理程序(参见 SaveItemActions.config)。这些事件处理程序现在在我的新 class ( SaveItemActions.cs) 中指向它们各自的方法。

不幸的是,我无法向 "item:created"、"item:deleted"、"item:versionAdded" 和 "item:versionRemoved" 添加处理程序,因为添加这些后我最终遇到以下错误。

Could not instantiate event handler. Type: Sitecore.Links.ItemEventHandler. Method: OnItemDeleted> (method: Sitecore.Events.Event.GetConfigSubscribers()).

但似乎我应该能够向这些事件添加处理程序,因为它们已经具有 Sitecore 提供的处理程序。例如来自 /sitecore/admin/showconfix.aspx:

<event name="item:deleted">
    <handler type="Sitecore.Links.ItemEventHandler, Sitecore.Kernel" method="OnItemDeleted"/>
    <handler type="Sitecore.Tasks.ItemEventHandler, Sitecore.Kernel" method="OnItemDeleted"/>
    <handler type="Sitecore.Globalization.ItemEventHandler, Sitecore.Kernel" method="OnItemDeleted"/>
    <handler type="Sitecore.Data.Fields.ItemEventHandler, Sitecore.Kernel" method="OnItemDeleted"/>
    <handler type="Sitecore.Rules.ItemEventHandler, Sitecore.Kernel" method="OnItemDeleted"/>
    <handler type="Sitecore.Caching.Placeholders.PlaceholderCacheManager, Sitecore.Kernel" method="UpdateCaches"/>
    <handler type="be.absi.kbs.web.Helpers.Processors.SaveItemActions, be.absi.kbs.web" method="OnItemDeleted>" patch:source="SaveItemActions.config"/>
    <handler type="Sitecore.Modules.EmailCampaign.Core.RootItemEventHandler, Sitecore.EmailCampaign" method="OnRootDeleted" patch:source="Sitecore.EmailExperience.ContentManagement.config"/>
</event>

我反编译了 Sitecore.Kernel.dll 以查看 Sitecore.Links.ItemEventHandler(见下文),但没有发现任何特别之处。

如果有人知道造成这种情况的原因或有任何反馈,请随时告诉我。

SaveItemActions.config

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
   <events>

  <event name="item:added">
    <handler type="be.absi.kbs.web.Helpers.Processors.SaveItemActions, be.absi.kbs.web" method="OnItemAdded" />
  </event>

  <!-- event name="item:created">
    <handler type="be.absi.kbs.web.Helpers.Processors.SaveItemActions, be.absi.kbs.web" method="OnItemCreated>" />
  </event-->

  <event name="item:saved">
    <handler type="be.absi.kbs.web.Helpers.Processors.SaveItemActions, be.absi.kbs.web" method="OnItemSaved" />
  </event>

  <event name="publish:complete">
    <handler type="be.absi.kbs.web.Helpers.Processors.SaveItemActions, be.absi.kbs.web" method="OnItemPublished" />
  </event>

  <!-- event name="item:deleted">
    <handler type="Sitecore.Links.ItemEventHandler, Sitecore.Kernel" method="OnItemDeleted>" />
  </event-->

  <!-- event name="item:versionAdded">
    <handler type="be.absi.kbs.web.Helpers.Processors.SaveItemActions, be.absi.kbs.web" method="OnVersionAdded>" />
  </event-->

  <!-- event name="item:versionRemoved">
    <handler type="be.absi.kbs.web.Helpers.Processors.SaveItemActions, be.absi.kbs.web" method="OnVersionRemoved>" />
  </event-->

  </events>
 </sitecore>
</configuration>

SaveItemActions.cs

using Sitecore.Data.Items;
using Sitecore.Events;
using Sitecore.Pipelines.Save;
using Sitecore.Publishing.Pipelines.PublishItem;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace be.absi.kbs.web.Helpers.Processors
{
    public class SaveItemActions 
    {
        public void OnItemSaved(object sender, EventArgs args)
        {
            // Extract the item from the event Arguments
            Item savedItem = Event.ExtractParameter(args, 0) as Item;
        }

        public void OnItemAdded(object sender, EventArgs args)
        {

        }

        public void OnItemCreated(object sender, EventArgs args)
        {

        }

        public void OnItemPublished(object sender, EventArgs args)
        {

        }

        public void OnItemDeleted(object sender, EventArgs args)
        {

        }

        public void OnVersionAdded(object sender, EventArgs args)
        {

        }

        public void OnVersionRemoved(object sender, EventArgs args)
        {

        }
    }
}

ItemEventHandler.cs

namespace Sitecore.Links
{
    public class ItemEventHandler
    {
        /*
        Bunch of other methods....
        */

        protected void OnItemDeleted(object sender, EventArgs args)
        {
            if (args == null)
            {
                return;
            }
            if (!Settings.LinkDatabase.UpdateDuringPublish && PublishHelper.IsPublishing())
            {
                return;
            }
            Item item = Event.ExtractParameter(args, 0) as Item;
            Assert.IsNotNull(item, "No item in parameters");
            LinkDatabase linkDatabase = ItemEventHandler.LinkDatabase;
            if (linkDatabase != null)
            {
                linkDatabase.RemoveReferences(item);
            }
        }
    }
}

你所有的代码都没有问题。这正是它应该如何写的。

唯一的问题是您的配置中有拼写错误。您的 3 个处理程序的 method 属性中有额外的 > 个字符(例如 method="OnItemDeleted>"):

<handler type="Sitecore.Links.ItemEventHandler, Sitecore.Kernel" method="OnItemDeleted>" />
<handler type="be.absi.kbs.web.Helpers.Processors.SaveItemActions, be.absi.kbs.web" method="OnVersionAdded>" />
<handler type="be.absi.kbs.web.Helpers.Processors.SaveItemActions, be.absi.kbs.web" method="OnVersionRemoved>" />