当你的客户深入应用SharePoint,创建了大量的站点,并且基于SharePoint开发了大量的工作流,这些工作流分布在不同的站点,那么客户经常会提出这样的需求:我在很多站点上都有工作流任务要处理,我每天都要在这些站点之间跑来跑去的去查看有没有要我审批的任务,有没有办法让我在统一的地方可以处理所有的任务?

你就要想了:这么问题确实难搞的,SharePoint每个网站集上的工作流任务都是分开的,要把他们整到一起不是那么好实现。

机灵一点的,就可以跟客户讲:SharePoint是by design的这种机制,任务是分散存储的,好在一般的任务都会有邮件提醒,收到邮件提醒就可以第一时间知道有需要自己处理的任务了,所以这个问题也不是一个很严重的问题。

如果这个客户不是那么好说话,或者,你认为客户提的需求是合理的,那么就要考虑下实现的方案了:

1)写个页面,将所有站点上当前用户的任务都查出来集中显示。

缺点:说过站点很多了,这个性能。。。。低啊

2)写个EventReceiver,利用Feature附加所有的任务列表上,在EventReceiver的ItemAdded和ItemUpdated以及ItemDeleted事件中,将任务同步到数据库,然后进行数据库查询,展示当前用户的任务。

缺点?好像实现稍微复杂一些,哈哈

如果你用了QuickFlow开发工作流,这个问题可以怎么解决呢?

QuickFlow支持EventBus-事件总线机制,即工作流中产生的所有事件,如流程创建、流程完成、任务创建、任务完成都可以通过统一的机制捕获,这些东西你都能捕获了,实现任务集中展示不是很容易吗?

EventBus机制的使用很简单,只要实现QuickFlow.EventBus.IWorkflowEventReceiver接口即可,如下:

/// <summary>
    /// 工作流事件处理器
    /// </summary>
    class ExampleWorkflowEventReceiver: QuickFlow.EventBus.IWorkflowEventReceiver
    {
        #region IWorkflowEventReceiver Members

        public void OnError(QuickFlow.EventBus.WorkflowContextProperties p)
        {
            //throw new NotImplementedException();
        }

        public void OnTaskCancel(QuickFlow.EventBus.WorkflowContextProperties p)
        {
            //throw new NotImplementedException();
        }

        public void OnTaskCompleted(QuickFlow.EventBus.WorkflowContextProperties p)
        {
            //throw new NotImplementedException();
        }

        public void OnTaskCreated(QuickFlow.EventBus.WorkflowContextProperties p)
        {
            //throw new NotImplementedException();
        }

        public void OnWorkflowCancel(QuickFlow.EventBus.WorkflowContextProperties p)
        {
            //throw new NotImplementedException();
        }

        public void OnWorkflowCompleted(QuickFlow.EventBus.WorkflowContextProperties p)
        {
            //throw new NotImplementedException();
        }

        public void OnWorkflowCreated(QuickFlow.EventBus.WorkflowContextProperties p)
        {
           // throw new NotImplementedException();
        }

        #endregion
    }

然后重载工作流基类的AppendEventReceivers方法,添加事件处理器:

public sealed partial class MultiTaskInOneStep: FlowchartWorkflow
    {
        public MultiTaskInOneStep()
        {
            InitializeComponent();
        }

        protected override void AppendEventReceivers(QuickFlow.EventBus.WorkflowEventReceiverCollection receivers)
        {
            //base.AppendEventReceivers(receivers);
            receivers.Add(new ExampleWorkflowEventReceiver());
        }

   }

 

有个朋友提出一个问题:

QuickFlow会在c盘创建一个QuickFlow.log.txt文件,如何去掉这个文件呢?

QuickFlow.log.txt是一个日志文件,里面记录了工作流的一些事件,这个日志文件的记录就是通过

EventBus机制实现的。在FlowchartWorkflow类中附加了一个默认的日志记录事件处理器:QuickFlow.EventBus.TracingEventReceiver,如果要禁止这个日志文件的创建,只需要将这个事件处理器去掉即可:

protected override void AppendEventReceivers(QuickFlow.EventBus.WorkflowEventReceiverCollection receivers)
{
           //base.AppendEventReceivers(receivers); //去掉基类自动附加的日志记录类
}

后记:最新版本提供了另外外一种方式扩展EventBus,事件处理器可以通过配置文件的方式配置:

修改C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\LAYOUTS\QuickFlow目录下的

 global.config文件即可:

<?xml version="1.0" encoding="utf-8"?>

<GlobalConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <EventReceivers>

    <Receiver Enabled="false" Name="Exception" Type="QuickFlow.EventBus.ExceptionEventReceiver,QuickFlow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ec1e0fe6e1745628" />

    <Receiver Enabled="true" Name="Tracing" Type="QuickFlow.EventBus.TracingEventReceiver,QuickFlow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ec1e0fe6e1745628" />

  </EventReceivers>

</GlobalConfiguration> 

 因此,不建议通过重载AppendEventReceivers的方式修改事件处理器。

在实现事件处理器的时候,一般不需要处理所有事件,建议直接继承QuickFlow.EventBus.WorkflowEventReceiver,然后重载需要的方法即可。

 

 

 

 

posted on 2009-09-15 22:32  jianyi  阅读(2419)  评论(4编辑  收藏  举报