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

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

  •  20-08-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

    Это было полезно?

    Решение

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

    Что-то вроде

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

    Другие советы

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

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

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

    Это, как говорится: Если списки, которые вы возвращаете близко друг к другу по длине, вы могли бы использовать словарь, используя ключ для представления & Quot; имя свойства & 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