Pregunta

Decidí que devolver conjuntos de datos, trabajar con conjuntos de datos y tablas de datos en una aplicación front-end es una idea bastante mala. Entonces, con la magia de los genéricos, estoy devolviendo una lista genérica a través de la llamada al servicio web (no WCF, simplemente olm asmx). Eso funciona a la perfección siempre que necesite devolver una lista por llamada a su servicio web.

El escenario en el que me encuentro es que tengo una pantalla más complicada donde hay algunos menús desplegables, etc. Necesito vincular esos menús desplegables a una lista genérica. El problema es que no quiero hacer varias llamadas web, una para cada menú desplegable, para obtener mis datos. En el pasado, habría devuelto un conjunto de datos y vinculado un menú desplegable a una tabla específica en el conjunto de datos.

Por lo tanto, sería estupendo devolver varias listas genéricas en una llamada web.

Cosas que he probado:

  1. Uso de una lista de listas
  2. Uso de una colección de listas genéricas
  3. Al crear una clase base y usar una Colección de List<Base>, hay problemas de conversión al intentar introducir objetos en ese List<MyOneObject>.
  4. Crear una clase que tenga propiedades que devuelvan List<MySecondObject>, List<MyType>, etc. Eso funciona pero es un poco desordenado ... Tengo muchas clases y pantallas en la aplicación donde esto sucedería. Podría crear una clase como esta que tenga propiedades de <=> para cada clase, pero como dije, creo que eso puede salirse de control.

Entonces, en este punto, tengo dos opciones, # 4 en la lista anterior, o simplemente devolver un conjunto de datos que preferiría no hacer: 0)

¿Alguien se ha encontrado con esto antes?

¿Fue útil?

Solución

Bueno, no creo que devolver varias listas sea una buena idea, pero si va a hacerlo, crearía una clase de contenedor con cada lista expuesta como una propiedad en esa clase.

Algo así

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

}

Otros consejos

La respuesta es # 4, a través de una clase, ya sea esa o varias llamadas, lo que preferiría no hacer

Bueno, parece que hoy empiezo todas mis respuestas con una pregunta. ¿Por qué no quieres hacer varias llamadas detrás de escena?

Si usa una llamada asincrónica p & # 229; desplegable / control que necesita vincular para obtener una experiencia de usuario más fluida. (especialmente cierto para grandes listas independientes) simplemente porque si solo hace una llamada, todos los menús desplegables / controles tendrán que esperar a que se devuelvan todos los demás datos de control.

Dicho esto: Si las listas que están devolviendo una longitud cercana entre sí, podría usar un diccionario, usando la tecla para representar & Quot; nombre de propiedad & Quot; y el valor para representar bien el valor. Muy poco código requiere y convertir lo que sea que sea la fuente en un diccionario con .ToDictionary () es bastante sencillo (si la fuente no es IEnumerable, la implementación de .ToDictionary () para esa fuente suele ser sencilla)

Dado su escenario, yo diría que devolver el resultado en XML sería la mejor manera de hacerlo. No solo puede devolver tantas listas como desee, sino que puede organizarlas de cualquier manera y, lo que es más importante, esta sería una solución universal y agnóstica. También puede transformar su conjunto de resultados directamente en xml.

Si devuelve una clase .NET, está limitado a solo los lenguajes .NET que llaman al servicio y si eso cambiara, tendría que volver a escribir las clases envolventes, etc. Con XML podría llamar al servicio desde cualquier idioma. Entonces, si está tratando de desacoplar su aplicación front-end de su capa de datos / modelo, esta sería una buena ruta a seguir.

Si lo desea, puede deserializar el resultado XML en una clase .NET, o simplemente extraer los datos directamente. LINQ to XML es rápido y fácil de usar y le permitiría transformar el resultado si es necesario.

<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) );
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top