DynamicActivity - 如何调用存储在数据库中的工作流?

时间:2010-06-25 13:13:58

标签: c# xaml visual-studio-2010 workflow-foundation-4

这是概念证明项目 - 目标是创建一个接收某些系统范围事件的应用程序,并根据某些业务规则调用特定的工作流程。

工作流是单独创建的,xaml源存储在数据库中。

以下是用于调用工作流程的代码:

public void RaiseEvent(IEvent e, IEventData eventData)
{ 

    var typeName = e.GetType().FullName;

    // Query Db for all workflows for the event
    var repo = new WorkflowRepository();

    var workflows = repo.GetActiveWorkflowsByEvent(typeName);

    foreach (var wf in workflows)
    {

        var condition =   
 ConditionEvaluator.PrepareCondition(wf.Condition.Expression, eventData);

        var okToStart = ConditionEvaluator.Evaluate(condition);
        if (okToStart)
        {

           // Next line is throwing an exeption
            object o = XamlServices.Parse(wf.WorkflowDefinition.Expression);


            DynamicActivity da = o as DynamicActivity;

            WorkflowInvoker.Invoke(da,  
                   new Dictionary<string, object>   
                       {{ "EventData", eventData }});                   


        }

    }

我们创建了非常简单的工作流程,可以自行运行。但是当使用XamlService.Parse加载xaml时,它抛出以下异常:

System.Xaml.XamlObjectWriterException was unhandled
  Message='No matching constructor found on type 'System.Activities.Activity'.   
You can use the Arguments or FactoryMethod directives to construct this type.' 
Line number '1' and line position '30'.

知道出了什么问题吗? 谢谢。

2 个答案:

答案 0 :(得分:2)

不确定是什么导致了您的问题,我过去使用过XamlServices.Load()没有任何问题,但在运行时加载工作流XAML的最简单方法是使用ActivityXamlServices.Load()。有关示例,请参阅here

答案 1 :(得分:0)

好的我已经通过使用ActivityXamlServices

解决了这个问题

所以不要这行:

object o = XamlServices.Parse(wf.WorkflowDefinition.Expression);

我正在使用以下代码段:

var mStream = new memoryStream(
    ASCIIEncoding.Default.GetBytes(wf.WorkflowDefinition.Expression));

object o = ActivityXamlServices.Load(mStream);