基本的な理解
大学でさえ、アルゴリズムを実装する前に、ブロック図として説明したことを覚えています。その後、コーディングに直接行きました。 プログラミングパラダイムの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.アプリケーションを実行してテストします。

プロジェクトのソースはこちらからダウンロードできます 。
すべての成功したアーキテクチャソリューションと快適なコーディング!