2

问候一个和所有!

我是 WF 4.0 和 WWF 的新手,所以如果这似乎是一个新手类型的问题,请原谅我,但请相信我,我已经在互联网的深处搜寻了解决这个问题的方法,但无济于事。

我创建了一个带有自定义 CodeActivity 的示例 WF 应用程序,该应用程序需要提供扩展,如下所示:

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);
}

然后,我将此活动插入到工作流服务中,并尝试通过添加服务引用来通过我的 Web 应用程序使用。但是,当我添加参考时,我得到:

System.Activities.ValidationException:必须配置“PizzaMan.ActivityLibrary.IPreparePizzaExtension”类型的扩展才能运行此工作流。

很公平——当然,我的活动要求我将 IPreparePizzaExtension 的实现传递给它——毕竟,我已经告诉它了!

所以我的问题是,我到底如何将它传递给服务?我可以在控制台应用程序场景中使用 WorkflowInvoker 轻松管理此操作,但我看不到任何明显的方法可以通过服务方法执行此操作。我会假设显然需要一种添加引用的程序化方法,但是我再次对如何进行此操作感到茫然。

任何帮助将不胜感激。

最好的问候伊恩

4

4 回答 4

7

WorkflowServiceHost 有一个 WorkflowExtensions 属性,您可以在其中添加工作流扩展。有几种方法可以做到这一点。如果您是自托管,则在创建 WorkflowServiceHost 时这很容易。如果您使用 IIS,则需要创建一个 ServiceHostFactory 来配置您的 WorkflowServiceHost。最后,还有一个选项可以使用 metadata.AddDefaultExtensionProvider() 函数在活动的 CacheMetadata 中添加工作流扩展。

于 2011-02-15T08:56:13.660 回答
0

解决如下,自托管风格:

    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();
    }
于 2011-02-16T09:03:23.937 回答
-1

还有这种处事方法: http ://wf.codeplex.com/wikipage?title=How%20do%20I%20add%20an%20extension%20to%20a%20WCF%20Workflow%20Service ?

于 2013-03-12T10:14:22.743 回答
-1

我的工具包对此有配置支持。请参阅http://neovolve.codeplex.com/wikipage?title=Neovolve.Toolkit.Workflow.dll%20-%201.1

于 2012-04-10T03:15:44.393 回答