Предоставление расширений рабочих процессов для службы рабочих процессов - WF 4.0 - PullRequest
2 голосов
/ 09 февраля 2011

Приветствую всех и каждого!

Я новичок в WF 4.0 и WWF в целом, так что простите меня, если это похоже на вопрос типа новичка, но поверьте мне, я изучил все глубины Интернетадля решения этой проблемы, но безрезультатно.

Я создал образец приложения WF с настраиваемой CodeActivity, для которого требуется расширение, как показано ниже:

public sealed class PreparePizza : CodeActivity
{
    public InArgument<Order> Order { get; set; }

    protected override void CacheMetadata(CodeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);

        if (this.Order == null)
            metadata.AddValidationError("You must supply an Order.");

        metadata.RequireExtension<IPreparePizzaExtension>();
    }
    // If your activity returns a value, derive from CodeActivity<TResult>
    // and return the value from the Execute method.
    protected override void Execute(CodeActivityContext context)
    {
        // Obtain the runtime value of the Text input argument
        Order order = context.GetValue(this.Order);
        var extension = context.GetExtension<IPreparePizzaExtension>();
        extension.Prepare(order);
    }
}

public interface IPreparePizzaExtension
{
    void Prepare(Order order);
}

Iзатем вставьте это действие в службу рабочего процесса и попытайтесь использовать его через мое веб-приложение, добавив ссылку на службу.Однако, когда я добавляю ссылку, я получаю:

System.Activities.ValidationException: расширение для типа «PizzaMan.ActivityLibrary.IPreparePizzaExtension» должно быть настроено для запуска этого рабочего процесса.

Достаточно справедливо - конечно, моя деятельность требует, чтобы я передал ему реализацию IPreparePizzaExtension - в конце концов, я сказал это!

Так что мой вопрос, как же я могу передать этона службу?Я могу достаточно легко управлять этим в сценарии консольного приложения, используя WorkflowInvoker, но я не вижу никакого очевидного способа сделать это с помощью сервисного подхода.Я бы предположил, что, очевидно, программный подход к добавлению ссылки - это то, что нужно, но опять же я не знаю, как именно это сделать.

Любая помощь будет принята с благодарностью.

С наилучшими пожеланиями, Ян

Ответы [ 4 ]

7 голосов
/ 15 февраля 2011

WorkflowServiceHost имеет свойство WorkflowExtensions, в которое можно добавить расширение рабочего процесса.Есть несколько способов сделать это.Если вы самостоятельно размещаете хостинг, это легко, так как вы создаете WorkflowServiceHost.Если вы используете IIS, вам нужно создать ServiceHostFactory, чтобы настроить ваш WorkflowServiceHost.Наконец, есть возможность добавить расширение рабочего процесса в CacheMetadata вашей деятельности, используя функцию metadata.AddDefaultExtensionProvider ().

0 голосов
/ 12 марта 2013

Существует также этот метод ведения дел: http://wf.codeplex.com/wikipage?title=How%20do%20I%20add%20an%20extension%20to%20a%20WCF%20Workflow%20Service?

0 голосов
/ 10 апреля 2012

Мой инструментарий имеет поддержку конфигурации для этого.Смотри http://neovolve.codeplex.com/wikipage?title=Neovolve.Toolkit.Workflow.dll%20-%201.1

0 голосов
/ 16 февраля 2011

Решено следующим образом, в стиле хостинга:

    static void Main(string[] args)
    {
        Workflow1 workflow = new Workflow1();
        // Provide some default values; note: these will be overriden once method on the service is called.
        workflow.productID = -1;

        Uri address = new Uri("http://localhost:1234/WorkflowService1");
        WorkflowServiceHost host = new WorkflowServiceHost(workflow, address);

        // Behaviours
        host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
        host.Description.Behaviors.Remove(typeof(ServiceDebugBehavior));
        host.Description.Behaviors.Add(new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });

        // Persistence
        var connStr = @"";
        var behavior = new SqlWorkflowInstanceStoreBehavior(connStr);
        behavior.InstanceCompletionAction = InstanceCompletionAction.DeleteNothing;
        behavior.InstanceLockedExceptionAction = InstanceLockedExceptionAction.AggressiveRetry;
        behavior.InstanceEncodingOption = InstanceEncodingOption.None;
        host.Description.Behaviors.Add(behavior);

        // Add extension implementations
        if (!TEST_MODE)
        {
            host.WorkflowExtensions.Add(new MyExtension());                
        }
        else
        {
            host.WorkflowExtensions.Add(new MyExtensionTest());
        }

        host.Faulted += new EventHandler(host_Faulted);

        host.Open();

        foreach (System.ServiceModel.Description.ServiceEndpoint endpoint in host.Description.Endpoints)
        {
            Console.WriteLine(endpoint.Address);
        }

        Console.WriteLine("Listening...");
        Console.ReadLine();
        host.Close();
    }
...