Windows Workflow Foundation-適用する理由と時期



基本的な理解



大学でさえ、アルゴリズムを実装する前に、ブロック図として説明したことを覚えています。その後、コーディングに直接行きました。 プログラミングパラダイムの1つであるワークフローは 、手続き型およびオブジェクト指向のアプローチとともに、一連の事前定義された機能ブロック( Activity )を使用してプロセスを視覚的に実装するだけで、その後のコーディングは不要です。



ワークフローパラダイムの実装の1つであるWFライブラリは、次の主な機能を提供します。



-機能ブロックの豊富なセット。

-カスタムの標準機能ブロックのセットの拡張。

-実行中のワークフローのインスタンスを保存および更新します。

-アプリケーションでのワークフローデザイナーの使用。

-WCFとの統合。

- ワークフローデザイナーでの段階的な診断。

-その他。



適用基準



ご存知のように、各テクノロジーには独自の応用分野があります。 特定のアルゴリズム/プロセスを実装するときにWFを使用する必要性を判断するには、3つの基準を適用します。



1.アルゴリズム/プロセスの実装は常に変化しています。



当社では、すべての製品の中核であるワークフローサブシステムを開発しました。 たとえば、数十のプロセスを持つ当社製品の多数の顧客がいる場合、数百の異なる変化するプロセスを取得します。



2.プロセス/アルゴリズムのリードタイムが長い。



当社の製品では、プロセスのライフサイクルは日と週で計算されます。 この場合、サーバーの障害または過負荷が発生した場合、プロセスを正しく再開して実行を継続する必要があります。



3.プログラマーの介入なしに、アルゴリズム/プロセスをエンドユーザーに変更する機能を提供する必要があります。



エンドユーザーに対するプロセスの編集(ビジネス分析)を可能な限り簡素化および促進するために、独自のデザイナーを開発しました。 これにより、開発者の負担を軽減できます。 そして、自分のプロセスを見て簡単に変更できることは、顧客にとって非常に魅力的です。



したがって、上記の要件の1つでも関連する場合、 WFはアルゴリズム/プロセスの可能な実装と見なされる必要があります。



導入例



WFの使用の入門例として、ワークフロープロセスを実装するだけで、 WFを使用することの妥当性に関する質問に答えます。

1. Blank Solutionテンプレートを使用して、新しいIsWWFUsefullSampleプロジェクトを作成します。







2.テンプレートアクティビティデザイナーライブラリを使用して、新しいプロジェクトIsWWFUsefullSample.Activitiesを追加します







3.既存のActivityDesigner1.xamlファイルを削除し、 アクティビティテンプレートを使用して新しい要素を追加します。







4.デザイナでアクティビティを開き、ブール型の必要なパラメータを追加します。



-基準を満たす3つの入力パラメーター:IsLongRunning、IsChangeable、IsDesignerNecessary。



-結果を返す1つの発信パラメーター:Result。



現時点では、 Workflow Activity内の式と型を記述するために使用できるのはVB.Net構文のみです 。 彼らはC#のサポートを追加することを約束します。







5.入力パラメーターの分析には、ネストされた3つのIfアクティビティ( ツールボックス->制御フロー-> If )を使用しますが、もちろん1つで対応できます。 結果を割り当てるには、 Assign Activity( Toolbox-> Primitives-> Assign )を使用します。 結果は次のアルゴリズムです。







6.ワークフロープロセスの準備ができました。 それを使用するには、 ワークフローコンソールアプリケーションテンプレートに基づいて、新しいIsWWFUsefullSample.TestClientアプリケーションを追加します。









7.ファイルWorkflow1.xamlを削除します。



8. IsWWFUsefullSample.Activitiesプロジェクトへのリンクを追加します。







9. Mainメソッドを実装します。 彼は、ユーザーに3つの質問に答えることを提案し、受け取ったソースデータでワークフロープロセスを開始し、計算の結果を表示します。



// ==============================================================

// <copyright file="Program.cs" company="The World as a Workflow">

// Copyright (c) The World as a Workflow. All rights reserved.

// </copyright>

// <author>Alexander Nechyporenko</author>

// <date>2011-07-12</date>

// ==============================================================



namespace IsWWFUsefullSample.TestClient

{

using System;

using System.Activities;

using System.Collections.Generic;

using System.Linq;

using System.Text;



using IsWWFUsefullSample.Activities;



/// <summary>

/// Console program class.

/// </summary>

public class Program

{

/// <summary>

/// Program starting point.

/// </summary>

/// <param name="args">Program parameters.</param>

public static void Main(string[] args)

{

// Question answers

const string Yes = "yes";

const string No = "no";

var answers = new List<string> { Yes, No };



// Create new activity instance

var activity = new IsWWFUsefull();

var parameters = new Dictionary<string, object>();



do

{

Console.WriteLine("Please, answer following questions to determine necessity of using WWF.");

Console.WriteLine();



// Read activity input parameters

parameters["IsLongRunning"] = ReadAnswer("Is process/algorithm long running?", answers) == Yes;

parameters["IsChangeable"] = ReadAnswer("Is process/algorithm frequently changed?", answers) == Yes;

parameters["IsDesignerNecessary"] =

ReadAnswer("Do you need a visual designer for your process/algorithm?", answers) == Yes;



// Execute activity

var result = WorkflowInvoker.Invoke(activity, parameters);



// Show result

Console.WriteLine();

if ((bool)result["Result"])

{

Console.WriteLine("Use WWF!");

}

else

{

Console.WriteLine("You don't need WWF but still can use it if you like it :).");

}

Console.WriteLine("---------------------------------------------------------------------");

Console.WriteLine();

}

while (ReadAnswer("Do you want to proceed?", answers) == Yes);



return;

}



/// <summary>

/// Read answer from console.

/// </summary>

/// <param name="question">Question text.</param>

/// <param name="answers">A list of posible</param>

/// <returns>Answer text.</returns>

private static string ReadAnswer(string question, IList<string> answers)

{

// Prepare answers prompting string

var answersString = new StringBuilder();

for (var i = 0; i < answers.Count; i++)

{

answersString.AppendFormat(i == 0 ? "{0}" : "/{0}", answers[i]);

}



// Read and validate the answer

var text = string.Empty;

var answer = string.Empty;

do

{

if (!string.IsNullOrEmpty(text))

{

Console.WriteLine(

string.Format("'{0}' doesn't belong to list of posible answers: '{1}'.", text, answersString));

}



Console.Write(string.Format("{0} ({1}): ", question, answersString));



text = Console.ReadLine();

answer = answers.Where(a => a == text.ToLower()).FirstOrDefault();

}

while (answer == null);



return answer;

}

}

}









10.アプリケーションを実行してテストします。







プロジェクトのソースはこちらからダウンロードできます



すべての成功したアーキテクチャソリューションと快適なコーディング!






All Articles