2010-11-22 10 views
0

シナリオ:制限クライアントの知識ワークフロー

.NET下
  • Windowsワークフロー財団(WF)複数
  • が同じパラメータでの操作、すべての受信WCFサービスとして展開4
  • ワークフロー
  • 操作名がアクティビティ名と一致する
  • SQL Serverワークフローの永続性を使用する
  • (SharePointなし)

デフォルトでは、サービス参照を追加してプロキシを生成すると、ワークフローの知識がクライアントに組み込まれます。クライアントは、利用可能なWCFメソッドを知っています。

私はクライアントからワークフローを切り離し、本質的に特定の規則に一致するワークフローで動作する「汎用」クライアントを作成したいと考えています。クライアントはSQLインスタンスストアに問い合わせて、指定されたインスタンスが待機していたアクティビティ/操作/ブックマーク(これは既に標準列ActiveBookmarks)を確認し、その選択肢をユーザーに提示します。

このようにして、クライアントを再コンパイル/再デプロイする必要なくワークフローを変更できます。いくつかの商用BPMシステムがこのように機能します。新しいヒューマン・クライアント・アクティビティーを追加することができ、それらはクライアントの作業キューに自動的に表示されます。すべてが動的に検出可能です。

どうすればいいですか?プロキシを生成するためにReflection.Emitを使用する必要がありますか?各操作で異なるサービス契約が使用された方が簡単でしょうか?

答えて

1

私はこれをいくつかのプロジェクトで行いましたが、うまくいきます。また、WCFとしてReflection.Emitを使用する必要はありません。

たとえば、次のコードはデフォルトのワークフローサービステンプレートを呼び出します。必要なのは、適切なURLを指定するだけです。

class Program 
{ 
    static void Main(string[] args) 
    { 

     var factory = new ChannelFactory<IMyService>(new BasicHttpBinding(), new EndpointAddress("http://localhost:9199/Service1.xamlx")); 
     var proxy = factory.CreateChannel(); 
     var response = proxy.GetData(new GetDataRequest() { Value = 42 }); 
     Console.WriteLine(response.Value); 
     Console.ReadLine(); 
    } 
} 

[ServiceContract(Name = "IService")] 
interface IMyService 
{ 
    [OperationContract] 
    GetDataResponse GetData(GetDataRequest request); 
} 

[MessageContract(IsWrapped = false)] 
class GetDataRequest 
{ 
    [MessageBodyMember(Name = "int", 
     Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] 
    public int Value { get; set; } 
} 

[MessageContract(IsWrapped = false)] 
class GetDataResponse 
{ 
    [MessageBodyMember(Name = "string", 
     Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] 
    public string Value { get; set; } 
} 

あなたはまた、「*」=タイプメッセージでのServiceContract内と外と名前を持つ単一のOperationContractを作成することができ、必要に応じて、あなたのWCFメッセージを手作りすることができ、より多くの柔軟性が必要な場合。

+0

これは、依然としてクライアント上のワークフローの詳細な知識を必要としているようです。私が知っているのは、 "[OrderEntry | {http://www.myurl.com/} IOrderEntryService:InternalReceiveMessage]"という文字列(InstanceStoreデータベースのInstances.ActiveBookmarks)とURLです。私は、操作が文字列パラメータを取り、voidを返すという慣例を確立しましたが、どの操作が事前に利用可能であるかはわかりません。別の開発者は、新しいOrderReview操作でワークフローを再デプロイすることができ、クライアントアプリケーションはそれを動的に検出して呼び出す必要があります。 – TrueWill

+1

このブログの投稿の2番目の部分をご覧くださいhttp://msmvps.com/blogs/theproblemsolver/archive/2010/11/23/calling-workflow-services-without-add-service-reference.aspx。これは、普遍的なWCF契約と低レベルのメッセージングで同じことを説明しています。メッセージがどのように見えるか、URLを知っている限り、送信することができます。 – Maurice

+0

私はこれを使用したとき、SQL Serverのテーブルを作成し、パラメータや戻り値などのさまざまなメッセージを作成するために必要なすべての操作の詳細を作成しました。 – Maurice

関連する問題