3

私は Web サービスを作成していますが、消費者が確認する必要がある多くのプロパティを持たずに、返されるデータをもう少し洗練したいと考えています。

バックグラウンドで生成されるデータに応じて、エラー データまたは消費者が期待していたデータを返すことができる必要があります。

大きなフラット オブジェクトを用意し、必要に応じてプロパティを入力し、ユーザーに「成功」​​フラグをチェックさせる代わりに、1 つのプロパティ Data をエラー クラスのインスタンスまたは成功クラス。

これは私がやりたいことの一種です:

class ItemResponse
{
    public bool Success { get; set; }
    public T Data{ get; set; }
}

if( /*acceptance criteria*/ )
{
    ItemResponse<SuccessData> resp = new ItemResponse<SuccessData>();
    resp.Data = new SuccessData();
}
else
{
    ItemResponse<ErrorData> resp = new ItemResponse<ErrorData>();
    resp.Data = new ErrorData();
}

return resp;


public class SuccessData
{

}

public class ErrorData
{

}

次に、Web メソッドがジェネリック プロパティを使用してオブジェクトを返すようにします。

Webmethod の戻り値の型を正しく入力する必要がある場合、これは可能ですか?

4

2 に答える 2

4

ジェネリックは、コンパイル時にタイプ セーフを追加するためのツールです。したがって、クラスのコンシューマによって使用される具象型は、コンパイル時に認識されている必要があります。関数を作成する場合

List<T> myFunction<T>() {...}

T...次に、呼び出すときに指定する必要があります。

var myResult = myFunction<int>();

...これにより、具体的な型がコンパイル時に認識されます。T(推測できるので指定しなくて、具体的な型はコンパイル時にわかります。)

ただし、 のジェネリック型をDataで決定したいrun-time場合: エラーが発生した場合は を返しItemResponse<SuccessData>、それ以外の場合はを返しますItemResponse<ErrorData>。それはジェネリックがどのように機能するかだけではありません。

于 2013-04-16T13:59:41.083 に答える
2

ショートバージョン、レイアウトしたとおりに提案していることを実行できません。

より長いバージョン のパート A :

Web サービスはクラスのメソッドのように考えることができ、実際にWeb サービス クラスから離れたメソッドです。Web サービスのセットアップの背後にあるメカニズムをよりよく理解するために、いくつかの Web サービスのチュートリアルを読むことをお勧めします。MSDN には、お気に入りの検索エンジンで簡単に見つけられる Microsoft スタック固有のチュートリアルが多数あります。

メソッドから返されたオブジェクトは、基本的にあなたが求めているポリモーフィックな動作を持つことはできません。

この擬似コードは、作成しようとしているものと同等であり、コンパイラが許可していないのはそのためです。どちら DoSomething()に電話をかけようとしているのかはわかりません。

class myFoo
{
     public SuccessResponse DoSomething() {....}  
     public ErrorResponse DoSomething() {....}
}

別の方法として、次のようなことを考えることもできます:
public [SuccessResponse | ErrorResponse] DoSomething()
しかし、それも明らかな理由で失敗します。C# は単にポリモーフィック リターンをサポートしていません。

パート B だけに焦点を当てたとしてもresp.Data、そのオブジェクトは何らかの型として宣言する必要があります。

class Response
{
     public Collection<someType> Data;
}

SuccessDataと が同じインターフェースをErrorData実装する場合、someType単純にそうなる可能性がありますIyourInterfaceが、それは別の問題を引き起こします。つまり、エンドユーザーは、適切なデータが提供されたかどうか、または代わりにエラー応答が含まれているかどうかをどのように知ることができますか.Data

IyourInterfaceWCFサービス オブジェクトのパブリック部分として宣言する限り、WCF はシリアル化するのに十分な機能を備えていると思います。しかし、それでもエンド ユーザーが何をすべきかを知る方法は解決されません。


応答のエレガンスさを少し下げたい場合は、成功データとエラー オブジェクトを次のように別の応答クラスにまとめるという古典的なパターンがあります。

class myResponse
{
    public SuccessResponse myRespData;
    public ErrorResponse myError
}

ここで、エンド ユーザーは、問題がなければエラーがないかどうかを確認します。エラーがないと仮定して、応答データを調べます。


あなたのコメントに基づいて、はい、次のこともできます。

class Response
{
    public List<IYourData> Data;
    public YourEnum ReturnType;
}

public class ResponseData : IYourData { ... }  
public class ErrorData : IYourData { ... }  

次に、クライアントで、次のような簡単なチェックを実行できます。

if( ReturnType == YourEnum.Success ) { ... }  
else if( ReturnType == YourEnum.Error ) { ... }  
else ... 

WCF が のシリアル化を処理Listします。配置されている設定に応じて、配列に変換するか、コレクションを直接渡します。その特定の側面を処理する SO Q&A がいくつかあります。

于 2013-04-16T13:40:22.717 に答える