2012-11-22 14 views
5

EventSubscripton'dan Eventing Code'umuzdaki Abonelikten çıkmaya çalışıyoruz. Biz eventing çalışması gerekiyordu edildiği müteakip olaylar çalışmamaya başlıyor,SDL Tridion EventSubscription Abonelikten Çıkma Sorun

[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(); 
    }} 

Ne gözlemledim o zamanlar “{EventSubsciption} .Unsubscribe” denir olduğu aşağıdaki kodu kullanıyor. Etkinlik sistemi ile ilgili hizmetler yeniden başlatıldıktan sonra, etkinlik kodu ilk kez beklendiği gibi çalışır ve sonraki olaylar için (bunun çalışması gereken) asla çağrılmaz.

+1

ne zaman nesne en 'Dispose()' yöntemi çağrılır edilir:

Benim Demirbaş Handler şöyle? Bildiğim kadarıyla bunun yalnızca işleyicinin çalıştırdığı modül kapatıldığında (ve potansiyel olarak o zaman bile değil) gerçekleşmesi gerekiyor. –

+0

Ve eğer Dispose() yoksa, beklendiği gibi çalışır? O zaman atmayı bırak? –

cevap

1

Dispose yöntemini kaldırmayı deneyin ve bunun bir fark yaratıp yaratmadığını görün. Tridion'un tetiklenen bir olayın ilk örneğinde Olay İşleyicisi'ni başlatması ve sistem yeniden başlatılıncaya kadar hiçbir zaman bir daha yapmaması mümkündür. Bu yüzden aboneliğinizi iptal edip elden çıkarırsanız, sınıfınız yeniden oluşturulmaz. Ortamınızdaki başka bir şeyin müdahalede bulunması da mümkündür. Söylemesi zor ama önce Dispose'ı kaldırarak deneyin.

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! 
     } 

    } 
} 
İlgili konular