Domanda

Ho iniziato a utilizzare Silverlight/Flex e mi sono imbattuto immediatamente nella chiamata al servizio asincrono.Sono abituato a risolvere i problemi di accesso ai dati in modo OO con un meccanismo di recupero del server o un altro.

Ho il seguente banale esempio di codice:

public double ComputeOrderTotal(Order order) 
{ 
   double total = 0;
   // OrderLines are lazy loaded
   foreach (Orderline line in order.Orderlines) 
   { 
       // Article,customer are lazy loaded 
       total = total + line.Article.Price - order.Customer.discount;
   }
   return total;
}

Se ho capito bene, questo codice è impossibile in Flex/Silverlight.Il caricamento lento ti costringe a lavorare con i callback.IMO il semplice esempio sopra sarà un GRANDE pasticcio.

Qualcuno può darmi un modo strutturato per implementare quanto sopra?

Modificare:

  • Il problema è lo stesso per Flex/Silverlight, il codice pseudo andrebbe bene
  • Non è proprio correlato agli orm ma la maggior parte degli ormi usa un caricamento pigro, quindi rimuoverò quel tag
  • Il problema è il caricamento lento nel modello
  • L'esempio sopra sarebbe molto fattibile di tutti i dati in memoria, ma supponiamo che alcuni debbano essere recuperati dal server
  • Le chiusure non aiutano poiché a volte i dati sono già caricati e non è necessario il recupero asincrono
È stato utile?

Soluzione 7

C # 5 async / await costrutto sarà quasi esattamente quello che voglio ..

guardare la presentazione di Anders Hejlsberg

Altri suggerimenti

Si deve convenire che la mappatura O / R di solito è fatto sul lato server della vostra applicazione. In Silverlight modo asincrono di esecuzione è il modello desiderato da utilizzare quando si lavora con servizi. Perché i servizi? Perché, come ho detto prima non c'è strumento di mappatura O / R al momento che potrebbe essere utilizzato sul lato client (Silverlight). L'approccio migliore è quello di avere il vostro O / R mappati dati esposti da un servizio che può essere consumato da un'applicazione Silverlight. Il modo migliore al momento è quella di utilizzare DataServices ADO.NET per trasportare i dati, e sul lato client per gestire i dati utilizzando LINQ to Services. Ciò che è veramente interessante di ADS (ex progetto Astoria) è che è stato progettato per essere utilizzato con Entity Framework, ma la brava gente anche implementato il supporto per IQueriable in modo sostanzialmente è possibile collegare qualsiasi provider di dati che supportano LINQ. Per citarne alcuni si può considerare LINQ to SQL, Telerik OpenAccess , LLBLGen, ecc per spingere gli aggiornamenti al server è richiesto l'origine dati per sostenere l'ADS IUpdateable.

Si può guardare solo esattamente come questo potrebbe essere fatto in una serie di blogposts che ho preparato qui: Guida introduttiva di ADO.NET Data Services e Telerik Open Access

Non posso parlare a Silverlight, ma Flex è una tecnologia client browser web e non ha alcun driver database incorporato nel runtime Flash. Si può fare interazioni protocollo HTTP a un server web invece. E 'lì nel web server di livello intermedio, dove potrete fare qualsiasi ORM rispetto ad una connessione al database, come Java JDBC. Hibernate ORM e iBATIS sono due scelte popolari nello spazio di livello intermedio Java.

Inoltre, a causa di questo:

Fallacies di Distributed Computing

Non si fa interazioni sincrone da un client Flex ai suoi servizi di livello intermedio. le operazioni di rete sincrone sono diventati verboten in questi giorni e sono la firma segno distintivo di un applicazione mal progettato -. come a causa di motivi elencati al link qui sopra, l'applicazione può (e spesso sarà) esporrà un'esperienza utente molto male

È invece effettuare chiamate asincrone per recuperare i dati, caricare i dati nel modello oggetto il vostro client di app (s) e procedere per implementare le operazioni sul modello. Con Flex e BlazeDS si può anche avere i dati di spinta di livello intermedio per il cliente e aggiornare il modello del cliente oggetti in modo asincrono. (Associazione dei dati è un modo per rispondere ai dati in fase di aggiornamento in modo event driven).

Tutto questo probabilmente sembra molto lontani dalla natura di inchiesta in un commento -, ma il vostro invio indica il gioco è fatto su un piano del tutto errato su come capire le tecnologie client-side che hanno sfornato programmazione asincrona e event-driven nella loro architettura fondamentale. Queste tecnologie client RIA sono stati progettati in questo modo del tutto di proposito. Quindi sarà necessario per imparare il loro modo di pensare, se si vuole avere una buona e produttiva esperienza con loro.

Vado in questo più in dettaglio, e con una prospettiva Flex, in questo articolo:

Flex async I / O vs Java e C # esplicita Threading

Nella mia esperienza diretta con Flex, credo che questa discussione sta diventando troppo complicata.

La vista concettuale OO non è diverso tra sincronizzazione e asincrono. L'unica differenza è che si utilizza i gestori di eventi a che fare con la conversazione host nel DAL, piuttosto che qualcosa tornato da una chiamata di metodo. E che spesso accade interamente sul lato host, e non ha nulla a che fare con Flex o Silverlight. (Se si utilizza AIR per un'applicazione workstation, allora potrebbe essere nel codice client, ma lo stesso vale. Come pure se si sta utilizzando AJAX prolungata. Silverlight, ovviamente, non ha equivalenti AIR.)

Sono stato in grado di progettare tutto quello che serve senza altre modifiche necessarie per accogliere asincrono.

Flex ha un modello a thread singolo.Se effettui una chiamata sincrona al server web, bloccheresti l'intera GUI dell'applicazione.L'utente avrà un'applicazione bloccata fino al completamento della chiamata (o al timeout in una condizione di errore di rete, ecc.).

Naturalmente i veri programmi RIA non sono scritti in questo modo.La loro GUI rimane accessibile e reattiva all'utente tramite l'uso di chiamate asincrone.Rende inoltre possibile avere indicatori di progresso reali che offrono pulsanti di annullamento e simili se la natura dell'interazione lo richiede.

Le vecchie applicazioni Web 1.0 con un'esperienza utente negativa mostravano un comportamento sincrono nelle loro interazioni con il livello Web.

Come sottolinea il mio articolo collegato, il modello asincrono a thread singolo abbinato alle chiusure ActionScript3 è una buona cosa perché è un modello di programmazione molto più semplice rispetto all'alternativa: scrivere app multi-thread.Il multi-threading era l'approccio di scrittura di applicazioni client-server Java Swing o C# .NET WinForm per ottenere un'esperienza utente altrettanto reattiva e fluida in ogni momento nella GUI.

Ecco un altro articolo che approfondisce l'intero argomento dell'architettura delle app distribuite asincrona, basata sulla messaggistica e sugli eventi:

Creazione di sistemi software distribuiti aziendali efficaci comunicazione guidata dai dati vs comunicazione guidata dal comportamento

Silverlight è una tecnologia client e l'Oggetto - mappatura relazionale avviene completamente nel server. Quindi devi dimenticato circa l'ORM in Silverlight.

Seguendo il tuo esempio quello che dovete fare è di creare un webservice (SOAP, REST ...) in grado di dare il vostro client di Silverlight l'oggetto completo "Ordine". Una volta che avete l'oggetto si può lavorare con essa senza la comunicazione con il server in un normale -. Maniera sincrona

Parlando di Silverlight, si dovrebbe verificare servizi RIA .

Semplicemente, porta il DataContext dal server al client da cui è possibile in modo asincrono una query che (non c'è bisogno di scrivere servizi WCF a mano, è tutto fatto da RIA).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top