Tridion - 事件系统对象未被破坏

时间:2012-08-27 20:11:03

标签: tridion tridion-2011

我创建了一个名为TcmExtension的{​​{1}},其中有一个事件处理程序订阅了WorkflowEventSystem事件。此事件的目的是安排发布相关工作流主题的所有依赖关系(即页面)。

我遇到的问题是,即使事件在正确的时间触发(工作流程过程完成),并且应该安排发布的所有项目都是,FinishProcess对象创建的事件似乎永远不会超出范围,因此WorkflowEventSystem对象也不会。

我是否缺少关于事件系统如何工作会导致这些对象永远存在的东西?我已将我认为的相关代码包括在内(部分内容汇总)。谢谢你的帮助。

以下是实际TcmExtension的大部分内容:

PublishScheduler

public class WorkflowEventSystem : TcmExtension { public WorkflowEventSystem() { this.Subscribe(); } public void Subscribe() { EventSystem.Subscribe<ProcessInstance, FinishProcessEventArgs>(ScheduleForPublish, EventPhases.All); } } 创建一个ScheduleForPublish对象(我创建的类):

PublishScheduler

private void ScheduleForPublish(ProcessInstance process, FinishProcessEventArgs e, EventPhases phase) { if(phase == EventPhases.TransactionCommitted) { PublishScheduler publishScheduler = new PublishScheduler(process); publishScheduler.ScheduleForPublish(process); publishScheduler = null; // worth a try } } 方法与此类似:

ScheduleForPublish

1 个答案:

答案 0 :(得分:10)

TcmExtension类的生命周期管理非常简单:

  1. 当您致电Subscribe时,您指定的TcmExtension对象会被添加到订阅的内部列表中

  2. 当您稍后致电Unsubscribe时,相同的TcmExtension对象将从订阅列表中删除

  3. 由于你永远不会调用Unsubscribe,你的WorkflowEventSystem永远不会被删除,因此.NET永远不会被垃圾收集。由于您的WorkflowEventSystem拥有对其创建的PublishScheduler实例的引用,因此也不会清除该实例。

    自定义TcmExtension的正确样板是:

    public class WorkflowEventSystem : TcmExtension, IDisposable
    {
        EventSubscription _subscription;
    
        public WorkflowEventSystem()
        {
            this.Subscribe();
        }
    
        public void Subscribe()
        {
             _subscription = EventSystem.Subscribe<ProcessInstance, 
                 FinishProcessEventArgs>(ScheduleForPublish, EventPhases.All);
        }
    
        public void Dispose()
        {
            _subscription.Unsubscribe();
        }
    }
    

    Nuno在本文中给出了一个更长的例子(处理多个订阅者): http://nunolinhares.blogspot.nl/2012/07/validating-content-on-save-part-1-of.html

相关问题