Как вернуть несколько общих списков за один веб-вызов? - PullRequest
0 голосов
/ 25 июня 2009

Я решил, что возвращать наборы данных, работать с наборами данных и таблицами данных в приложении переднего плана - довольно плохая идея. Итак, с магией обобщений я возвращаю обобщенный список через вызов Webservice (не WCF, просто обычный asmx). Это работает очень хорошо, если вам нужно возвращать один список за вызов к вашему веб-сервису.

Сценарий, с которым я сталкиваюсь, заключается в том, что у меня есть более сложный экран с несколькими выпадающими списками и так далее. Мне нужно связать эти выпадающие списки с общим списком. Проблема в том, что я не хочу делать несколько веб-звонков, по одному для каждого раскрывающегося списка, чтобы получить мои данные. Раньше я просто возвращал набор данных и привязывал выпадающий список к определенной таблице в наборе данных.

Таким образом, было бы супер возвращать несколько общих списков за один веб-вызов.

Вещи, которые я пробовал:

  1. Использование списка списков
  2. Использование коллекции общих списков
  3. При создании базового класса и использовании коллекции List<Base> возникают проблемы с преобразованием при попытке вставить объекты в этот List<Base>.
  4. Создание класса со свойствами, которые возвращают List<MyOneObject>, List<MySecondObject> и т. Д. Это работает, но это немного грязно ... У меня есть много классов и экранов в приложении, где это может произойти. Я мог бы создать такой класс, который имеет свойства List<MyType> для каждого класса, но, как я уже сказал, я думаю, что он может выйти из-под контроля.

Итак, на данный момент у меня есть два варианта, # 4 в приведенном выше списке, или просто вернуть набор данных, который я бы предпочел не делать: 0)

Кто-нибудь сталкивался с этим раньше?

Ответы [ 4 ]

3 голосов
/ 25 июня 2009

Ну, я не думаю, что возвращение нескольких списков - хорошая идея, но если вы собираетесь это сделать, я бы создал класс-оболочку, каждый список которого был бы представлен в виде свойства в этом классе.

Что-то вроде

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

}
0 голосов
/ 03 июня 2012

Учитывая ваш сценарий, я бы сказал, что возвращение результата в 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) );
0 голосов
/ 25 июня 2009

Ну, похоже, я начинаю все свои ответы сегодня с вопроса? Почему бы вам не сделать несколько звонков за сценой?

Если вы используете один асинхронный вызов с раскрывающимся списком / контролем, вам нужно связать, чтобы получить более свободный пользовательский опыт. (особенно актуально для больших независимых списков) просто потому, что если вы делаете только один вызов, все выпадающие / контрольные списки должны будут ждать возвращения всех остальных контрольных данных.

Это, как говорится: Если списки, которые вы возвращаете близко друг к другу по длине, вы могли бы использовать словарь, используя ключ для представления «имени свойства» и значение для точного представления значения. Требуется очень мало кода, и преобразование того, что является источником, в словарь с помощью .ToDictionary () довольно просто (если источник не IEnumerable, реализующий .ToDictionary () для этого источника обычно просто)

0 голосов
/ 25 июня 2009

Ответ # 4, через класс, либо тот, либо несколько вызовов, что вы бы не хотели делать

...