2

みなさん、こんにちは!

私はWF4.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を使用している場合は、WorkflowServiceHostを構成するためにServiceHostFactoryを作成する必要があります。最後に、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://neovolve.codeplex.com/wikipage?title=Neovolve.Toolkit.Workflow.dll%20-%201.1を参照してください

于 2012-04-10T03:15:44.393 に答える
-1

物事を行うこの方法もあります: http ://wf.codeplex.com/wikipage?title = How%20do%20I%20add%20an%20extension%20to%20a%20WCF%20Workflow%20Service ?

于 2013-03-12T10:14:22.743 に答える