2010-01-21 7 views
5

Sto lavorando a un'applicazione Web ASP.NET che utilizza molto JavaScript sul lato client per consentire all'utente di eseguire operazioni di riordino degli elenchi mediante trascinamento della selezione, cercando gli elementi per aggiungere all'elenco (come i suggerimenti nella barra di ricerca di Google), eliminare elementi dall'elenco, ecc.Mantenimento della coerenza tra i modelli di oggetti JavaScript e C#

Ho una "classe" JavaScript che uso per memorizzare ciascuno degli elementi di elenco sul lato client come nonché informazioni su quale azione l'utente ha eseguito sull'elemento (aggiungi, modifica, elimina, sposta). L'unica volta che la pagina viene pubblicata sul server è quando l'utente ha terminato, appena prima che la pagina venga inviata, serializzo tutte le informazioni sulle modifiche apportate a JSON e le archivia in campi nascosti nella pagina.

Quello che sto cercando è qualche consiglio generale su come compilare le mie lezioni in C#. Penso che potrebbe essere bello avere una classe in C# che corrisponda a quella di JavaScript in modo da poter semplicemente deserealizzare il JSON alle istanze di questa classe. Sembra un po 'strano però avere classi sul lato server che duplicano direttamente le classi JavaScript e esistono solo per supportare l'implementazione dell'interfaccia utente JavaScript.

Questa è una specie di domanda astratta. Sto solo cercando qualche forma di guida da parte di altri che hanno fatto cose simili in termini di mantenimento dei corrispondenti modelli di oggetti lato client e server.

risposta

1

Ha perfettamente senso. Se dovessi affrontare questo problema, prenderei in considerazione l'utilizzo di una singola descrizione definitiva del tipo o classe di dati e quindi la generazione di codice da quella descrizione.

La descrizione potrebbe essere un file sorgente javascript; potresti creare un parser che generi il codice C# appropriato da quel JS. Oppure, potrebbe essere un file sorgente C# e tu fai il contrario.

È possibile trovare più utilità nel descriverlo in RelaxNG e quindi creare (o trovare) un generatore sia per C# che per Javascript. In questo caso lo schema RelaxNG verrebbe controllato nel controllo del codice sorgente e gli artefatti generati non lo sarebbero.


EDIT: Inoltre v'è una specifica nascente chiamato WADL, che credo potrebbe aiutare in questo senso pure. Non ho valutato WADL. Periferico, sono consapevole che non ha preso d'assalto il mondo, ma non so perché sia ​​così. There's a question on SO regarding that.


EDIT2: Data la mancanza di strumenti (WADL è apparentemente nato morto), se fossi in te potrei provare questo approccio tattico:

  • Utilizzare gli attributi [DataContract] sulle tue C# tipi e trattare quelli come definitivi.
  • crea uno strumento che si insinua nel tuo tipo C#, da un assembly compilato e crea un'istanza del tipo, utilizzando JsonSerializer su un documento JSON XML di esempio, che fornisce una sorta di "definizione del modello di oggetto". Lo strumento dovrebbe in qualche modo verificare che il tipo istanziato possa effettuare il round-trip in JSON equivalente, magari con un checksum o un CRC sulle cose risultanti.
  • esegue questo strumento come parte del processo di compilazione.

Per rendere questo accada, ci si controlla in quel "campione documento JSON" in codice sorgente e che avrebbe dovuto anche fare in modo che è la forma che si stava utilizzando nei vari codice JS nella tua app. Dal momento che Javascript è dinamico, potresti anche aver bisogno di un verificatore del tipo o qualcosa del genere, che verrebbe eseguito come parte di jslint o qualche altro passo di verifica del build-time, che verificherebbe l'origine Javascript per vedere che sta usando le definizioni del modello objbect "standard" .

+0

Grazie, sembra un'idea interessante utilizzare RelaxNG. Di recente ho fatto alcune cose con Google Protocol Buffers, che utilizza il proprio linguaggio per definire una classe come questa, quindi puoi generare le versioni appropriate per qualsiasi lingua tu stia codificando. È interessante come un'idea può essere applicata in più diversi scenari e tecnologie. Non posso credere di non aver pensato di farlo prima. –

+0

ya, ho pensato anche ai protobuf. Mi chiedo se il codice generato che esce da un protobufs .idl sia utilizzabile senza il serializzatore protobufs. In tal caso, è possibile utilizzare JsonSerializer in .NET, con il codice C# generato dallo strumento protobufs. – Cheeso

+0

Quindi stai suggerendo di confrontare un'istanza serializzata della classe C# con un documento statico contenente JSON che rappresenta la mia struttura dati. Se corrispondono, so che la classe C# è giusta. Quindi confronterei le istanze della stessa classe in JavaScript con il documento JSON e, se corrispondono, allora verificheremo che sarò in grado di scambiare dati avanti e indietro da client a server senza problemi di serializzazione e deserializzazione. –

Problemi correlati