代码改变世界

开发sharepoint工作流过程中的Ptifall(容易犯的错误)

2008-11-26 12:25  Virus-BeautyCode  阅读(861)  评论(0编辑  收藏  举报

      开发sharepoint工作的五个步骤:
      1、为你的工作流建模
            在工作流设计器中可以完成
      2、为你的工作流设计表单
            有四种类型的表单可以设计
                  1)关联表单,建立工作流和列表或者内容类型的关联的时候使用的表单,例如是否使用默认值
                  2)初始化表单,初始化工作流的时候使用的表单,是否允许申请人手动启动工作流,如果是的话,需要填写那些信息
                  3)任务表单,任务相关的表单
                  4)修改工作流的表单,在工作流运行过程中调整工作流使用
            左右的表单都要做两件事,1)收集用户信息 2)调用对象模型的一个功能来表现行为,例如,创建关联,修改任务等,传递给工作流的数据通过功能的参数来实现。(MOSS提供了默认的InfoPath表单可以使用)
      3、编写代码
      4、部署工作流
      5、调试工作流直到满意
      Host和workflow的交互使用了workflow提供的两个活动:CallExternalMethod 和HandleExternalEvent ,分别使用在workflow传递数据给Host和Host传递数据给workflow两个方向上。
      CallExternalMethod 就是通过服务接口中定义的事件将信息在事件参数中传递给Host,事件在Host中注册处理程序,处理参数(传递过来的数据)。
      HandleExternalEvent 就是向外部提供一个激活自己事件的方法,供外界调用,同时传递参数给workflow,在工作流中还要写事件对应的处理代码,事件的Handler代码,接收、处理外部传过来的参数。

      sharepoint工作流预定义了很多任务相关的活动,CreateTask就是一个   CallExternalMethod  ,在工作流中可以操作sharepoint对象模型,创建任务,相当于向Host中的sharepoint发送信息,信息就是新建一个工作流任务。OnTaskChanged就是一个HandleExternalEvent ,就是Host向工作流发送消息,工作流任务改变了,在工作流中要做出响应。可以说一个工作流任务是属于一个工作流实例的,工作流任务的修改和删除都要经过Host来通知工作流,就是使用sharepoint工作里组件中要On开头的那些组件,也就是通过交互方法提供的方法来激活工作流对应的事件,然后由工作流来做出响应。
      
      Pitfall容易犯的错误:
      1、在sharepoint中操作未提交的列表项
            对于还没有提交的列表或者列表项,不要使用对象模型来调用它们。记住要首先持久化他们,在获取他们之前,要使用event handler或者delay。例如,如果你创建工作流任务,任务列表的列表项在你使用event handler或者delay睡觉工作流之前是不存在的。使用工作流服务没有问题,但是在睡觉工作流之前不要使用对象模型操作列表项。

      CallExternalMethod活动的invoking属性的方法运行在服务执行之前,HandlerExternalEvent活动的Invoking属性的方法运行在服务执行之后,并且激活工作流。

      2、使用CreateTask或者OnTaskChanged的SPWorkflowTaskProperties属性作为sharepoint任务列表进行操作
      当你使用CreateTask的时候,你绑定到CreateTask的TaskProperties属性的对象还只是任务的初始值,还没有和任务列表同步,因此对于任务来说,还没有任务改变,反之亦然。同样的概念也适用于OnTaskChanged的AfterProperties属性。
      由于还没有实践开发,所以这句话我也没有很理解。估计是说在你用这两个活动的时候,不可以使用这两个属性来映射对应的任务项,因为他们还没有和数据库同步,是不是说明数据库中的内容还是旧的任务项,而通过这两个属性获取的任务项已经是更新过的了。这还需要实践的检验。

      关于correlationToken,你可以把它想象成workflow用来唯一标识Sharepoint对象的东西。如果你的CreateTask活动、OnTaskChanged活动、CompleteTask  活动都要映射同一个任务项的话,就需要把他们的correlationToken设置一样。
下面的三组活动需要设置相同的correlation token

“Workflow” token:
OnWorkflowActivated
OnWorkflowItemChanged
OhWorkflowItemDeleted
SetState
SendEmail
UpdateAllTasks
Task token:
CreateTask
CreateTaskWithContentType
UpdateTask
DeleteTask
CompleteTask
RollbackTask
OnTaskChanged
OnTaskDeleted
OnTaskCreated
Modification token:
EnableWorkflowModification
OnWorkflowModified

          使用InfoPath表单的好处
      1、可以直接在OFFICE2007客户端中打开
      2、可以很容易的在InfoPath设计器中进行修改,拖拽,添加验证规则
      3、是无代码的开发,如何实现特殊功能的调用呢,可以在Host的页面中调用对象模型来做

      Pitfall:在反持久化工作流之后重新使用SharePoint的不可序列化对象
      许多非工作流的SharePoint对象,例如SPListItem,是不可序列化的,所以当工作流被持久化之后,这些东西将不可用。如果你试图在工作流激活之后使用他们,将会发生错误。为了避免这些情况,在你反持久化工作流之后再使用他们。
      Pitfall:不要忘记将自定义类标识为可序列化
      当你在工作流中添加自定义类的时候,不要忘记给类添加[Serializable]特性。如果没有添加这个特性,当你在睡觉工作流,并且序列化类的时候,工作流将会失败。
      Pitfall:更新锁定的列表项
      如果一篇文档打开或者被锁定,更新列会抛出异常。如果你需要工作流修改列表项的某一个栏目,你可以a)在锁定释放的时候在修改或者b)使用item.SystemUpdate()来绕过锁定,但是如果这么做,文档打开又关闭的时候,不会保存工作流做的修改。

      Office开发,在MSDN的Office开发中有很多关于SharePoint结合Office客户端的例子,工作流,outlook开发,communicator开发等内容,大家可以参考的。
      http://msdn.microsoft.com/en-us/office/cc514057.aspx