我创建了一个名为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
答案 0 :(得分:10)
TcmExtension
类的生命周期管理非常简单:
当您致电Subscribe
时,您指定的TcmExtension
对象会被添加到订阅的内部列表中
当您稍后致电Unsubscribe
时,相同的TcmExtension
对象将从订阅列表中删除
由于你永远不会调用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