Как вернуть несколько общих списков за один веб-вызов?

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

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

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

Что я пробовал:

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

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

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


person virtualadrian    schedule 25.06.2009    source источник


Ответы (4)


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

Что-то типа

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

}
person kemiller2002    schedule 25.06.2009
comment
+1 - Это просто объект Model в шаблоне Model/View/Controller. - person Eric Petroelje; 25.06.2009
comment
В итоге я использовал Wrapper. Это был вариант № 4 в моем списке выше. В итоге получается красиво. Если одно из этих свойств, скажем, Object2List остается нулевым, XML даже не генерируется для передачи обратно клиенту. (да, я знаю, что я эффективный нацист). Другой вариант состоял в том, чтобы сериализовать и сжать в строку и десериализовать на клиенте... но это звучит как слишком много работы. В любом случае, спасибо за ответ/подтверждение :0) - person virtualadrian; 25.06.2009

Ответ № 4, через класс, либо это, либо несколько вызовов, которые вы бы предпочли не делать.

person Stuart    schedule 25.06.2009

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

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

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

person Rune FS    schedule 25.06.2009

Учитывая ваш сценарий, я бы сказал, что возврат результата в 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) );
person Despertar    schedule 03.06.2012