2009-07-20 8 views
2

C#関数に渡されるオプションのデータをサポートする最適な方法は何ですか?C#webmethodのオプション引数の最適な作成方法

私は5つの引数を定義して.NETでのWebサービス機能があります。この関数のコードは(どちらかが、簡単ではありません)が長すぎるものではなく、唯一の場所はどこ機能であり

[WebMethod] 
    public string UploadFile(string wsURL 
     , byte[] incomingArray 
     , string FileName 
     , string RecordTypeName 
     , MetaData[] metaDataArray) 

を任意のメタデータ[]処理すべきである場合、私は、このテストを実行します。

 if (metaDataArray.Length > 0) 
     { 
      Update update = BuildMetaData(metaDataArray); 
      treq2.Items = new Operation[] { sru, cin, update, fetch}; 
     } 
     else 
     { 
      treq2.Items = new Operation[] { sru, cin, fetch}; 
     } 

私は(最後の引数として、すなわちない「メタデータ」アレイ)4つの引数をとる上方の迅速かつダーティバージョンを必要としそう私は関数全体をクローン化し、me​​t-1を参照するIF-ELSEブロックを削除しましたアダータ。醜い私は知っている。

[WebMethod] 
    public string UploadFileBasic(string wsURL 
     , byte[] incomingArray 
     , string FileName 
     , string RecordTypeName) 

今、私はより良いことをしたいと思いますし、これをサポートする最善の方法についてアドバイスを探しています。空の配列を5番目のパラメータとして作成することでクライアントプログラムに負担をかけたくない...このオプションのデータを処理するのに十分なスマートなWebサービス機能を持たせたい。ありがとう。

答えて

7

5つの引数をとるメソッドのチェックを変更します(値がnullの場合はチェックする必要があります)。

if (metaDataArray != null && metaDataArray.Length > 0) 
    { 
     Update update = BuildMetaData(metaDataArray); 
     treq2.Items = new Operation[] { sru, cin, update, fetch }; 
    } 
    else 
    { 
     treq2.Items = new Operation[] { sru, cin, fetch}; 
    } 

次に、4引数バージョンでは、引数の5つのバージョンをmetaDataArray引数nullで内部的に呼び出します。

どのように単一のクラスにメタデータアレイを含むすべての引数を置くことについて、Webサービスへの引数として使用
[WebMethod] 
public string UploadFileBasic(string wsURL, 
           byte[] incomingArray, 
           string FileName, 
           string RecordTypeName) 
{ 
    return UploadFile(wsUrl, incomingArray, fileName, RecordTypeName, null); 
} 
+0

+1私の答えが自分の既存のコードに巧みにフィットしていたにもかかわらず、これは私が自分のコードで使う方法です。 –

+0

ありがとうございました。あなたの役に立つ答えから新しい方法で関数のオーバーロードの優雅さがわかります。 –

+0

このアプローチに従うと、新しい問題が発生しました。 http://stackoverflow.com/questions/1160299/how-to-access-a-web-service-with-overload-methods –

3
private static readonly MetaData[] EmptyMetaData = new MetaData[0]; 

[WebMethod] 
public string UploadFile(string wsURL 
    , byte[] incomingArray 
    , string fileName 
    , string recordTypeName) 
{ 
    return UploadFile(wsURL, incomingArray, fileName, recordTypeName, EmptyMetaData) 
} 
0
[WebMethod] 
    public string UploadFileBasic(string wsURL 
     , byte[] incomingArray 
     , string FileName 
     , string RecordTypeName) 
{ 
    return UploadFile(wsURL, incomingArray, FileName, RecordTypeName, new MetaData[0]); 
} 

その後UploadFileメソッドはすべてを処理しますが、あなたは、消費者が何を望んでいるかに応じて2つのインターフェイスを公開することができます。

+0

測定可能であっても)。 0長の配列は事実上不変なので、そのジョブのためだけに 'private static readonly'クラスメンバを含めるのは簡単です。 –

+0

@ 280Z28 OPは、「クライアントプログラムに第5パラメータとして空の配列を作成して負担をかけたくない」と言っています。クライアント/消費アプリに負担はありません。 –

2

:彼はおそらくにISNオブジェクト生成のオーバーヘッドを(」避けたい

public class UploadFileAgrument 
{ 
    public string wsURL; 
    public byte[] incomingArray; 
    public string FileName; 
    public string RecordTypeName; 
    public MetaData[] metaDataArray; 
} 

[WebMethod] 
public string UploadFile(UploadFileAgrument fileToUpload) 
{ 
    if(fileToUpload.metaDataArray!=null && metaDataArray.Length > 0) 
    { 
    } 
    else 
    { 
    } 
} 
+0

興味深い考えをありがとう。私は、WebサービスとWSを消費するクライアントが知る必要のあるタイプを最小限に抑えたいと考えています。私はこれがその目標に反していると思うが、そうでなければきちんとした考えである。ありがとう。 –

関連する問題