2012-11-22 6 views
5

Staramy się anulować subskrypcję eventSubscripton w naszym Kodzie Wdrażania. Używamy następujący kodSDL Tridion EventSubscription UnSubscribe Issue

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

Co możemy stwierdzić, że po „{} .Unsubscribe EventSubsciption” nazywa, WKKW przestaje działać dla kolejnych zdarzeń, dla których jest to ma działać. Po ponownym uruchomieniu usług związanych z systemem zdarzeń kod zdarzenia działa zgodnie z oczekiwaniami po raz pierwszy i nigdy nie jest wywoływany dla kolejnych zdarzeń (dla których miał działać).

+1

Po 'Dispose() wywoływana jest metoda' Twój obiektu? O ile mi wiadomo, powinno się to zdarzyć tylko wtedy, gdy moduł, który uruchamia program obsługi, jest zamknięty (a potencjalnie nawet wtedy nie). –

+0

A jeśli nie pozbędziesz się() działa zgodnie z oczekiwaniami? Więc przestań się wyrzucać? –

Odpowiedz

1

Spróbuj usunąć metodę usuwania i sprawdź, czy to ma znaczenie. Możliwe, że Tridion tworzy Event Handler po pierwszym wystąpieniu zdarzenia, a następnie nigdy nie robi tego ponownie, dopóki system nie zostanie zrestartowany. Jeśli więc zrezygnujesz z subskrypcji i pozbędziesz się jej, twoja klasa nie będzie ponownie tworzona. Możliwe też, że coś innego w twoim otoczeniu przeszkadza. Trudno powiedzieć, ale spróbuj najpierw usuwając Dispose.

Moja boilerplate Handler wygląda następująco:

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

    } 
} 
Powiązane problemy