DynamicActivity - как вызвать рабочий процесс, который хранится в базе данных? - PullRequest
2 голосов
/ 25 июня 2010

Это подтверждение концепции проекта. Цель состоит в том, чтобы создать приложение, которое получает некоторые общесистемные события и на основе некоторых бизнес-правил запускает определенный рабочий процесс.

Рабочие процессы создаются отдельно, а источник 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 }});                   


        }

    }

Мы создали очень простой рабочий процесс, который работает без проблем самостоятельно.Но когда xaml загружается с использованием XamlService.Parse, он выдает следующее исключение:

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 ]

2 голосов
/ 25 июня 2010

Не знаю, в чем причина вашей проблемы, в прошлом я без проблем использовал XamlServices.Load (), но самый простой способ загрузки XAML рабочего процесса во время выполнения - использование ActivityXamlServices.Load ().См. здесь для примера.

0 голосов
/ 25 июня 2010

Хорошо. Я решил эту проблему с помощью ActivityXamlServices

Итак, вместо этой строки:

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

Я использую следующий фрагмент:

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

object o = ActivityXamlServices.Load(mStream);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...