这是概念证明项目 - 目标是创建一个接收某些系统范围事件的应用程序,并根据某些业务规则调用特定的工作流程。
工作流是单独创建的,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'.
知道出了什么问题吗? 谢谢。
答案 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);