12

この質問は、特定の対象を絞った質問というよりも、実際の状況でコミュニティで人々が何をしているかを発見するための調査です。私はこれについてかなり広範囲に検索しました。多くのブロガーがコントラクト ファースト サービス設計を提唱し、それらを裏付けるいくつかのコメントを見つけましたが、WCF でのコントラクト ファーストの実装、長所と短所に関する実用的な情報をまだ見つけていません。私は最近、主に Thomas Erl の著書を通じて SOA について大規模な調査を行いましたが、彼が提唱する主要な概念の 1 つはコントラクト優先設計です。

私の質問は次のとおりです。

  1. .NET と WCF を使用してコントラクト ファーストのサービス設計にどのようにアプローチしますか?
  2. コントラクトからクライアントとサービスの両方を生成できる svcutil 以外のツールはありますか? (VSと統合できるものなら何でも理想的です)
  3. コントラクト ファースト デザインと wCF に関して、実際にどのようなプロに出会ったことがありますか?
  4. コントラクト ファースト デザインと WCF に関して実際に遭遇した短所は何ですか?

コントラクトファースト開発の主な問題の 1 つは、ツールにあるようです。Svcutil は、コントラクトからサービス コードを生成できる唯一のものであり、出力がかなり貧弱です。その単一ファイルには、属性とコード生成アーティファクトがぎっしり詰まっており、基本的に、コントラクトが更新されるたびに再生成して置き換える必要があります。私はより良いアプローチ、できればregen-replaceを必要としないものを好むでしょう。実際のシナリオで実用的であると仮定して、サービス側のコントラクトを手動で作成しても問題ありません。

編集:

WCSF は当面のニーズを解決してくれましたが、 Protocol BuffersService Factoryについて学ぶことはどちらも興味深いツールであり、将来役立つと確信しています。

4

5 に答える 5

15

WSCFは、VS 統合を備えたコントラクト ファースト ツールを提供します。見てみな。(自由)

7 月 6 日現在、セットアップ プログラムを含むバイナリ リリースがあります。

于 2009-07-02T11:57:05.880 に答える
5

私はコントラクト優先のアプローチを使用しますが、通常は (常にではありませんが) 各端で同じ型表現を使用します。

実際、WCF を使用するために特別なプロキシなどは必要ありません。両端で通常の .NET タイプを使用できますが、まったく使用svcutil.exe ません。機能するサービスを取得するには、構成ファイルに「ABC」を追加し、次のようなものを使用するだけです。

public sealed class WcfClient<T> : System.ServiceModel.ClientBase<T>
    where T : class
{
    public T Service { get { return base.Channel; } }
}

これで、次を使用できます。

using(var client = new WcfClient<IMyService>()) {
    int i = client.Service.SomeMethod("abc");
}

クライアント(およびサーバー)にあるのはIMyServiceインターフェースだけです。


他のツールの場合; protobuf-net は、Google の「プロトコル バッファ」API の実装であり、データとサービスを「コントラクト ファースト」(および移植可能/相互運用可能) な方法で記述するための DSL があります。たとえば (.proto ファイル):

message SearchRequest {
  required string query = 1;
  optional int32 page_number = 2;
  optional int32 result_per_page = 3;
}
message SearchResponse {
  repeated string result = 1; 
}
service SearchService {
  rpc Search (SearchRequest) returns (SearchResponse);
}

protobuf-net ツール (私が管理しています) には、この DSL を C#/VB に変換するための "protogen" ユーティリティが含まれています。オプションの1つ(少なくともC#の場合-VBをチェックする必要があります)は、完全なWCFプロキシ実装を(同期または非同期メソッドを選択して)発行することです。svcutil と非常に似ていますが、(protobuf-net 関係により) 操作コントラクトにカスタム属性が含まれているため、 (より高速で効率的ですが、異なります)[ProtoBehavior]代わりに protobuf-net シリアライザーを使用します。DataContractSerializer

VS 統合の場合。私はまさにそれに取り組んでいます(証明)。

于 2009-07-02T11:33:37.473 に答える
3

私はコントラクトファースト開発を好みます。この目的のためにService Factoryを使用しました。これにより、サービスとクライアント コードの両方をカスタマイズなしで生成することができました。

カスタマイズにより、Entity Framework オブジェクトに対応するデータ転送オブジェクトと、あるオブジェクトから別のオブジェクトに変換するコードを生成することもできました。例外の自動ロギング; サービスの HTML ドキュメント。

これは、サービス ファクトリに付属するコード分析規則に追加されるもので、開発者が互換性のない WCF オプションを選択して失敗するのを防ぐのに役立ちます。

于 2009-06-26T03:36:14.193 に答える
2

WCF では、「コントラクト ファースト」がどのように見えるかについていくつかの多様性があります。データとサービス コントラクトが適切な属性マークアップを使用して .NET 型として表現される「コード コントラクト ファースト」を実行できます。WSDL から開始してサービス コントラクトとデータ コントラクトを生成することも、XML スキーマからデータ コントラクトを開始してサービス コントラクトをコードとして表現することもできます。どちらの方法を取るかは、契約の性質と使用方法によって異なります。

WSDL 仕様に何かを実装する場合、WSDL からのコード生成は当然の選択であり、手動で生成することはそれほど大したことではありません。WSDL ファイルへの変更をすぐに反映させたい場合は、プロジェクト ビルド イベントから生成をトリガーする (または msbuild に入る) ことができます。

データ コントラクトとして使用したい既存のスキーマ (XSD) がある場合、または他のプラットフォームで簡単に再利用できるようにデータ コントラクトを開発したい場合は、xsd.exe (または 3 番目のパーティーの代替)。この場合、次のように、コード指向のサービス コントラクトで XML シリアル化可能な型を使用します。

クライアントとサーバーを .NET で自分で開発していて、クライアントがコントラクト アセンブリを取得できるか、サービス メタデータ (WSDL など) からクライアントを生成できる場合、コードでコントラクトをモデル化するのは素晴らしい経験です。"既知の型" スキームを使用すると、データ コントラクトで継承モデルをサポートできます。これは非常に強力です。クライアントでコントラクト アセンブリを直接参照することで、クライアント コードの生成を完全にスキップできます (他の返信で述べたように)。これは非常に生産的で洗練されたものですが、凝りすぎると相互運用の問題が発生する可能性があることに注意する必要があります。

于 2009-12-02T04:42:27.690 に答える
0

これを行う方法は、このビデオで説明されています。

http://www.dnrtv.com/default.aspx?showNum=103

コード生成を使用しないという考え方です。したがって、コントラクトが変更されたときにコードを再生成する必要がなくなります。

コントラクトはコード内にあり、変更することができます。クライアントとサーバーの間に不一致がある場合、ビルド エラーに表示されます。

于 2009-07-05T20:39:08.923 に答える