1つのWebコールで複数の汎用リストを返すにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1043558

  •  20-08-2019
  •  | 
  •  

質問

データセットを返すこと、フロントエンドアプリでデータセットとデータテーブルを操作することは、かなり悪い考えだと思いました。したがって、ジェネリックの魔法で、Webサービスコールを介してジェネリックリストを返しています(WCFではなく単なるol 'asmx)。 Webサービスへの呼び出しごとに1つのリストを返す必要がある限り、これはうまく機能します。

私が実行しているシナリオは、いくつかのドロップダウンなどがあるより複雑な画面があるということです。これらのドロップダウンを汎用リストにバインドする必要があります。問題は、データを取得するために、ドロップダウンごとに1つずつ、複数のWeb呼び出しを行いたくないことです。以前は、データセットを返し、ドロップダウンをデータセット内の特定のテーブルにバインドしていました。

したがって、1回のWeb呼び出しで複数の汎用リストを返すのは非常に便利です。

試したこと:

  1. リストのリストの使用
  2. 汎用リストのコレクションの使用
  3. 基本クラスを作成し、List<Base>のコレクションを使用すると、オブジェクトをList<MyOneObject>に詰め込もうとすると変換の問題が発生します。
  4. List<MySecondObject>List<MyType>などを返すプロパティを持つクラスを作成します。それでも動作しますが、ちょっと面倒です...これが起こるアプリにはたくさんのクラスと画面があります。クラスごとに<=>のプロパティを持つこのようなクラスを作成することもできますが、先ほど言ったように、制御不能になる可能性があると思います。

したがって、この時点で2つのオプション、上記のリストの#4を使用するか、データセットを返します。

これに遭遇した人はいますか?

役に立ちましたか?

解決

まあ、複数のリストを返すことは良い考えだとは思いませんが、もしそうするつもりなら、各クラスをそのクラスのプロパティとして公開するラッパークラスを作成します。

次のようなもの

class Wrapper
{
   public List<object1> Object1List {get;set;}
   public List<object1> Object2List {get;set;}

}

他のヒント

答えは、クラスを介した#4、その呼び出しまたは複数の呼び出しのいずれかです。

さて、今日は質問からすべての答えを始めるようです。 なぜ舞台裏で複数の電話をかけたくないのですか?

1つの非同期呼び出しを使用する場合p <!>#229;バインドする必要があるドロップダウン/コントロールを使用すると、よりスムーズなユーザーエクスペリエンスが得られます。 (特に大規模な独立リストの場合に当てはまります)1回の呼び出しのみを行うと、すべてのドロップダウン/コントロールが他のすべてのcontrlsデータが返されるまで待機する必要があるためです。

それは言われています: 長さが互いに近いリストを返す場合は、キーを使用して<!> quot; property name <!> quot;を表す辞書を使用できます。値を適切に表す値。ソースが.ToDictionary()を使用して辞書に変換することを必要とするコードはほとんどありません(ソースがIEnumerableでない場合、そのソースの.ToDictionary()を実装するのは通常簡単です)

あなたのシナリオを考えると、結果をXMLで返すことが最善の方法だと思います。必要な数のリストを返すことができるだけでなく、任意の方法でリストを整理できます。最も重要なことは、これは言語に依存しない、普遍的なソリューションになります。結果セットを直接xmlに変換することもできます。

.NETクラスを返す場合、サービスを呼び出す.NET言語のみに制限されます。変更された場合、ラッパークラスなどを書き換える必要があります。XMLを使用すると、任意の言語からサービスを呼び出すことができます。そのため、フロントエンドアプリをデータ/モデルレイヤーから分離しようとしている場合、これは良い方法です。

必要に応じて、XML結果を.NETクラスに逆シリアル化することも、データを直接抽出することもできます。 LINQ to XMLは高速で使いやすく、必要に応じて結果を変換できます。

<result>
  <dropdownA_item>
     <Value/>
  </dropdownA_item>
  <dropdownA_item>
  <dropdownA_item>
  <dropdownB_item>
  <dropdownB_item>
  <dropdwonC_item>
  // return as many different lists for as many different drop downs
</result>

// manually extract the data or deserialize into .net class
XElement result = GetResult();
dropdownBox[x].Items = result // you could even have an array of dropDownBoxes[x] and bind to all of them in one loop
    .Where(o => o.Name == "dropdown" + x)
    .Select(o => o.Element("Value").Value) );
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top