Достижение вашей цели здесь, вероятно, будет довольно сложно, однако позволяет начать с простой бит: -
Вы можете восстановить последовательность действий с XOML использованием WorkflowMarkupSerializer
найденную в System.Workflow.ComponentModel.Serialization
пространстве имен ,
var serializer = new WorkflowMarkupSerializer();
object root = serializer.Deserialize(myXmlReader);
Аналогично можно реконструировать «фрагмент» деятельность, состоявшийся в то, что наследуется от CompositeActivity использования CompostiteActivityMarkupSerializer
.
Однако для интеграции нового действия root в текущий рабочий процесс требуется больше работы. Для создания нового действия вам необходимо использовать экземпляр класса WorkflowChanges
, изменив определение рабочего процесса, используемое текущим экземпляром.
Теперь документация - это какая-то отрывочная и даже немного уклончивая по этому вопросу. Два важных момента можно почерпнуть хотя: -
- В конечном итоге вызов
ApplyWorkflowChanges
нужен и этот элемент имеет protected
доступность.
- Документация указывает, что это должно произойти в корневой активности рабочего процесса.
Следовательно, мы можем сделать вывод о том, что для выполнения этого требования нам понадобится пользовательская корневая активность.
Возможно, существует множество способов структурирования этого метода, но предположим, что у нас есть SequenceActivity
, в котором у нас есть пользовательская активность «InvokeWorkflow», выполняющая модификацию рабочего процесса, и мы намерены поместить полученную новую активность в конец, содержащую последовательность ,
Сначала нужно определение интерфейса, который мы можем реализовать на заказ корневой деятельности: -
internal interface IModifiableWorkflow
{
void ApplyWorkflowChanges(WorkflowChanges workflowChanges);
}
В нашей пользовательской корневой активности мы бы реализовать этот интерфейс явно: -
public class CustomSequentialActivity : SequentialWorkflowActivity, IModifiableWorkflow
{
void IModifiableWorkflow.ApplyWorkflowChanges(WorkflowChanges workflowChanges)
{
base.ApplyWorkflowChanges(workflowChanges);
}
}
В способе пользовательского действия «InvokeWorkflow» Execute
: -
// Get root activity
var root = this.Parent;
while (root.Parent != null) { root = root.Parent; }
// Create an instance of WorkflowChanges based on the root activity
var changes = new WorkflowChanges(root);
//Find the parent sequence activity in the transient workflow definition
var target = changes.TransientWorkflow.GetActivityByName(this.Parent.Name);
Activity newActivity = YourCodeToLoadActivityDetailsFromXoml();
target.Activities.Add(newActivity);
//Apply the new changes
((IModifiableWorkflow)root).ApplyWorkflowChanges(changes);
Примечание. Я на самом деле не протестировал ни одно из этого, его вымолотый кусок из крошек информации, похожей на документацию.
ссылка не работает :( –