いくつかのプロセスを非同期的に開始し、非同期イベントが到着したときにウェイクアップする必要がある、カスタムの Windows Workflow Foundation アクティビティを作成しています。
私が見つけたすべてのサンプル (たとえば、Kirk Evans によるもの) には、ほとんどの作業を行うカスタム ワークフロー サービスが含まれており、アクティビティによって作成されたキューにイベントがポストされます。その主な理由は、[WF 以外のスレッドから機能する] イベントを投稿する唯一の方法が WorkflowInstance.EnqueueItem であり、アクティビティがワークフロー インスタンスにアクセスできないため、イベントを投稿できないことです。 (非同期操作の結果を受け取る非 WF スレッドから)。
この設計は好きではありません。機能が 2 つに分割され、新しいアクティビティ タイプが追加されたときにホストにサービスを追加する必要があるからです。醜い。
そこで、アクティビティの非同期イベント ハンドラーから呼び出し、さまざまな非同期アクティビティで再利用できる次の汎用サービスを作成しました (エラー処理は省略されています)。
class WorkflowEnqueuerService : WorkflowRuntimeService
{
public void EnqueueItem(Guid workflowInstanceId, IComparable queueId, object item)
{
this.Runtime.GetWorkflow(workflowInstanceId).EnqueueItem(queueId, item, null, null);
}
}
アクティビティ コードでは、このサービスへの参照を取得して保存し、非同期操作を開始し、完了したら、このサービスを使用してイベントをキューに投稿できます。この利点 - すべてのアクティビティ固有のコードをアクティビティ内に保持し、アクティビティの種類ごとに新しいサービスを追加する必要がありません。
しかし、公式およびインターネットのサンプルがそれを行っているのを見ると、再利用不可能なサービスに特化しています。このアプローチが問題ないかどうかを確認したいですか、それともここでいくつかの問題を引き起こしていますか?