1

アプリ プロトコルの基になるトランスポート メカニズムとして WCF を使用するアプリケーションがありますが、この質問は特に WCF ではなく、サービス指向の設計に関するものです。

サーバー上で実行されているさまざまなデータ ソース プラグインがあり、クライアントがサービスで GetData を呼び出し、データ ソース名を指定して参照できます。このような関数呼び出しは、延滞請求書の配列などのデータのリストを返します。

class OverdueAccounts
{
    float Amount;
    int Days;
    string Reference;
}

または、未解決のサポート ケースの配列:

class OpenTickets
{
    DateTime Date;
    Guid TicketId;
    TicketStatus Status;
}

返されるタイプと利用可能なデータアクセス方法を知るのは、プラグインをロードするときだけです。

public interface IDataSourcePlugin /* plugin running on server */
{
  string Name;
  Type DataType;
  object GetDataType(); // returns a type of the type specified above by DataType
}

public interface IAppService /* service contract */
{ 
  [OperationContract]
  object GetData(string datasourceName); // will call plugins IDataSourcePlugin.GetDataType
}

私の問題は、これらの型は実行時にのみ認識されることであり、型指定されていないオブジェクトは好きではありませんが、必要なものを達成するための他の推奨される方法はわかりません。

XML の文字列を返し、検証する DTD を指定することでデータ オブジェクトを転送することを考えましたが、これにより、WCF が既に実行できることの上に追加のレイヤーが追加されます。

ReadString(string fieldname)または、などの具体的な一連の操作をセットアップするReadInt(string fieldname)こともできますが、それは多くの呼び出しを意味する可能性があります。

各クライアントが直接データ ソースに向かうのではなく、データ フローとメッセージを設定されたプロトコル内に保ち、すべてクライアントからサーバー、そしてサーバーからデータ ソースに向かうことが重要です。これは、キャッシングおよびその他のビジネス要件のためです。

実行時にのみ知ることができるタイプのトランスポートと構造、または代替設計を構造化する方法に関する推奨事項は素晴らしいでしょう。

4

1 に答える 1

1

ServiceBehaviorカスタムで をサービスに追加する必要がありDataContractResolverます。このカスタムDataContractResolverでは、タイプと対応する名前を動的に追加できます。

クライアント側でも同様のコントラクト リゾルバーを追加する必要がある可能性が高いため、これは、サービスから受け取る可能性のある型がわかっている場合にのみ機能します。

両方のリゾルバーで単純な辞書を使用しています。

于 2012-11-13T11:16:46.100 に答える