Упражнение: отношение экземпляра Workflow Instance один к одному - PullRequest
1 голос
/ 21 апреля 2011

Я пытаюсь реализовать расширение деятельности WF4, которое будет обрабатывать некоторые длительные операции с данными и время от времени отправлять информацию обратно в «материнскую» деятельность.

Я реализовал версию этого, но у меня есть проблемы с ней, если я использую это действие в контексте параллельного действия. Как видно из приведенного ниже кода, действие создает закладку и после этого вызывает объект MyActivityExtension. Я хочу, чтобы у каждого экземпляра класса MyActivity был свой экземпляр MyActivityExtension для связи. Если два действия этого типа используются последовательно в одном определении рабочего процесса, все работает нормально, и вызовы класса расширения выполняются для различных объектов, но если одно действие начинает выполнение, а другое бездействует, второе действие использует тот же экземпляр расширения, например бездействующий.

Ниже я добавил упрощенный пример своего кода. Любая идея, как я могу навязать непосредственное отношение между экземплярами деятельности и экземплярами расширения деятельности?

Заранее спасибо, Alex

MyActivity код:

    protected override void Execute(NativeActivityContext context)
    {
        //Some data processing....

        //Obtain the activity extension
        MyActivityExtension extension = context.GetExtension<MyActivityExtension >();


        string bookmarkName = "MyActivity_" + Guid.NewGuid().ToString();
        var bookmark = context.CreateBookmark(bookmarkName, BookmarkResumed);

        extension.ProcessData(bookmarkName);
    }

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);
        metadata.AddDefaultExtensionProvider<MyActivityExtension >(() => new MyActivityExtension ());
    }

 private void BookmarkResumed(NativeActivityContext context, Bookmark bookmark, object value)
    {
       //some data retrieving operations
    }

Код MyActivityExtension:

public class MyActivityExtension : IWorkflowInstanceExtension
{
    private WorkflowInstanceProxy instance;
    private Guid id;

    public MyActivityExtension()
    {
         id = Guid.NewGuid();
    }

    internal void ProcessData(string bookmarkName)
    {
        Console.WriteLine("My activity extension Id: " + id.ToString());

        //Some data processing
    }

    public IEnumerable<object> GetAdditionalExtensions()
    {
        return null;
    }

    public void SetInstance(WorkflowInstanceProxy instance)
    {
        this.instance = instance;
    }
}

1 Ответ

1 голос
/ 21 апреля 2011

IWorkflowInstanceExtension помогает с одним расширением для одного отношения рабочего процесса, но каждое действие, как вы обнаружили, будет иметь одинаковое расширение.Не существует готового способа создать новое расширение для каждого действия.Я бы изменил расширение на некую фабрику расширений с помощью функции Create (), которая возвращает новый объект.

Итак, ваш код будет выглядеть примерно так:

   protected override void Execute(NativeActivityContext context)
    {
        //Some data processing....

        //Obtain the activity extension
        MyActivityExtensionFactory extensionFactory = context.GetExtension<MyActivityExtensionFactory >();
        MyActivityExtension extension = extensionFactory.Create();

        string bookmarkName = "MyActivity_" + Guid.NewGuid().ToString();
        var bookmark = context.CreateBookmark(bookmarkName, BookmarkResumed);

        extension.ProcessData(bookmarkName);
    }
...