2012-11-22 9 views
5

Stiamo tentando di annullare l'iscrizione da eventSubscripton nel nostro Codice evento. Stiamo utilizzando il seguente codiceSDL Tridion EventSubscription Annulla sottoscrizione Numero

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

Quello che abbiamo osservato è che una volta che “{} EventSubsciption .Unsubscribe” si chiama, Eventing smette di funzionare per gli eventi successivi per i quali si suppone di lavorare. Una volta riavviati i servizi relativi al sistema degli eventi, il codice evento funziona come previsto solo per la prima volta e non viene mai chiamato per eventi successivi (per i quali avrebbe dovuto funzionare).

+1

quando è 'Dispose)' viene richiamato il metodo del vostro oggetto (? Per quanto ne so, ciò dovrebbe accadere solo quando il modulo su cui è in esecuzione il gestore viene arrestato (e potenzialmente nemmeno in quel momento). –

+0

E se non si dispone di Dispose() funziona come previsto? Quindi smettere di smaltire? –

risposta

1

Provare a rimuovere il metodo Dispose e vedere se questo fa la differenza. È possibile che Tridion istanzia l'Event Handler alla prima istanza di un evento che viene generato, e quindi non lo fa mai più fino al riavvio del sistema. Quindi, se annulli l'iscrizione e la disposizione, la tua classe non verrà più istanziata. È anche possibile che qualcos'altro nel tuo ambiente stia interferendo. Difficile da dire, ma prova a rimuovere prima il Dispose.

mio gestore boilerplate simile a questa:

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

    } 
} 
Problemi correlati