2

簡単な WCF サービスを作成しました。いくつかの検索基準に基づいて特定のエンティティを検索する方法を書いています。

[OperationContract]
List<SiteDTO> GetList(int? siteID, string code, string name, 
    string notes, byte? status, string description, 
    int? modifiedBy, DateTime? modifiedDate, long? 
    timeStamp, int? pageNo, int? pageSize, out int? 
    totalRows, int x);

ここで 2 つの質問があります。

  1. プリミティブ変数をサービス メソッドに渡す必要がありますか、それともすべてクラス (つまり SiteSearchDTO) にラップする必要があります。なぜ詳細お願いします。

  2. 2 番目の質問は、プロジェクト内のサービスへの参照を追加すると、そこで対応するメソッドが生成されるということです。しかし、 では署名が異なりますReference.cs

public System.Collections.Generic.List<RPMS.Web.SiteService.SiteDTO>
    GetList(out System.Nullable<int> totalRows, 
    System.Nullable<int> siteID, string code, string name, 
    string notes, System.Nullable<byte> status, string description, 
    System.Nullable<int> modifiedBy, 
    System.Nullable<System.DateTime> modifiedDate, 
    System.Nullable<long> timeStamp, 
    System.Nullable<int> pageNo, 
    System.Nullable<int> pageSize, int x)

問題は、生成されたメソッドにint があることですか? 最初のパラメーターとしてのtotalRowsですが、元のサービス メソッドでは totalRows は最後から 2 番目の変数です。なんで?

4

2 に答える 2

2

あなたの最初の質問に答えるために、多くの異なる意見があります、しかし、私はロバート・マーティンからのものが最高だと思います:

関数の引数の理想的な数はゼロ(ニラディック)です。次は1つ(モナディック)、続いて2つ(ダイアディック)です。3つの引数(トライアド)は、可能な限り避ける必要があります。3つ以上(ポリアディック)は非常に特別な正当化を必要とします-そしてとにかく使用されるべきではありません。

理由を答えるには、しかし、まあ、それは簡単です。これらすべてのパラメーターを持つことにカプセル化はありません。リストを見るだけで、多分pageNopageSizeとを除くすべてxが関連していることは明らかです。したがって、グループ化としてのみであっても、相互に関連していることを反映するために、クラス/構造にカプセル化する必要があります。

これらがすべて型に配置されていると仮定すると、カプセル化が適切な単一のパラメーターを持つ関数があり、全体的な管理が容易になります。

2番目の質問に対して、プロキシとそれが生成されたサービス/メソッドが同期していないと思われます。svcutil.exeツール(プロキシを生成する)は、パラメーターの順序を尊重します。そうでない場合(プロキシコードとサーバーコードが同期していないことを検証したことを意味します)、バグが見つかりました(ただし、最初にプロキシを再生成して再確認します)。

于 2012-06-24T13:31:31.890 に答える
0

最初の質問については、アーキテクチャと技術的な選択によって異なります

- The problem when you pass entity, you create dependance on your entity library, and you contraign your client to reference it, your layer become depend of entity layer.



2. For the second question proxy class is generated by basing on meta data of your wsdl, check your wsdl of your web service.
于 2012-06-24T13:26:45.777 に答える