5

Eventing コードで eventSubscripton から Unsubscribe しようとしています。次のコードを使用しています

[TcmExtension("EventHandlerExtension")]
public class EventHandler : TcmExtension, IDisposable
{
    private EventSubscription componentSaveSubscription = null;
    private EventSubscription componentPublishSubscription = null;

    #region Public Methods
    /// <summary>
    /// Handle for Eventing System
    /// </summary>
    public EventHandler()
    {
        Subscribe();
    }
    /// <summary>
    /// Subscribe Events
    /// </summary>
    public void Subscribe()
    {
        //News Article Page created when component Save
        componentSaveSubscription = EventSystem.Subscribe<Component, SaveEventArgs>(OnComponentSavePost, EventPhases.TransactionCommitted);

        //EventSystem.Subscribe<Component, SaveEventArgs>(OnComponentSavePost, EventPhases.TransactionCommitted);
        componentPublishSubscription = EventSystem.Subscribe<Component, PublishOrUnPublishEventArgs>(OnComponentPublishOrUnPublishPost, EventPhases.TransactionCommitted);
        //EventSystem.Subscribe<StructureGroup, PublishOrUnPublishEventArgs>(OnStructureGroupPublishInitiated, EventPhases.TransactionCommitted);

    }
    /// <summary>
    /// IDisposable Implementation
    /// </summary>
    public void Dispose()
    {

        if (componentSaveSubscription != null) componentSaveSubscription.Unsubscribe();
        if (componentPublishSubscription != null) componentPublishSubscription.Unsubscribe();
    }}

私たちが確認したことは、「{EventSubsciption}.Unsubscribe」が呼び出されると、イベント処理が機能するはずの後続のイベントで機能しなくなることです。イベント システム関連のサービスが再起動されると、イベンティング コードは最初の 1 回だけ期待どおりに動作し、(動作するはずだった) 以降のイベントで呼び出されることはありません。

4

1 に答える 1

1

Dispose メソッドを削除してみて、違いが生じるかどうかを確認してください。イベントの最初のインスタンスが発生したときに Tridion がイベント ハンドラーをインスタンス化し、システムが再起動されるまでそれを再度実行しない可能性があります。したがって、サブスクライブを解除して破棄すると、クラスが再びインスタンス化されることはありません。環境内の他の何かが干渉している可能性もあります。言うのは難しいですが、最初に Dispose を削除してみてください。

私のボイラープレート Handler は次のようになります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Tridion.ContentManager;
using Tridion.ContentManager.CommunicationManagement;
using Tridion.ContentManager.ContentManagement;
using Tridion.ContentManager.ContentManagement.Fields;
using Tridion.ContentManager.Extensibility;
using Tridion.ContentManager.Extensibility.Events;

namespace NicksEventSystem
{
    [TcmExtension("NicksEventSystemExtension")]
    public class NicksEventHandler : TcmExtension
    {
        public NicksEventHandler()
        {
            Subscribe();
        }

        private void Subscribe()
        {
            EventSystem.Subscribe<Component, FinishActivityEventArgs>(MyEvent, EventPhases.TransactionCommitted);
        }

        private void MyEvent(Component wfComponent)
        {
            //... Do stuff!
        }

    }
}
于 2012-11-22T22:23:53.220 に答える