2010-01-21 10 views
5

Estoy trabajando en una aplicación web ASP.NET que usa mucho JavaScript en el lado del cliente para permitir al usuario hacer cosas como reordenar listas, arrastrar y soltar, buscar elementos para agregar a la lista (como las sugerencias en la barra de búsqueda de Google), eliminar elementos de la lista, etc.Mantenimiento de consistencia entre JavaScript y modelos de objetos C#

Tengo una "clase" de JavaScript que utilizo para almacenar cada uno de los elementos de la lista en el lado del cliente como así como información sobre qué acción ha realizado el usuario en el elemento (agregar, editar, eliminar, mover). La única vez que se publica la página en el servidor es cuando el usuario finaliza, justo antes de enviar la página serializo toda la información sobre los cambios que se hicieron en JSON y la guardo en campos ocultos en la página.

Lo que estoy buscando es un consejo general sobre cómo desarrollar mis clases en C#. Creo que sería bueno tener una clase en C# que coincida con la de JavaScript, así que puedo deserealizar el JSON en instancias de esta clase. Sin embargo, parece un poco extraño tener clases en el servidor que dupliquen directamente las clases de JavaScript y que solo existan para admitir la implementación de la IU de JavaScript.

Esto es una especie de pregunta abstracta. Solo estoy buscando alguna guía de otros que hayan hecho cosas similares en términos de mantener modelos de objetos del lado del servidor y el servidor que coincidan.

Respuesta

1

Tiene perfecto sentido. Si tuviera que enfrentar este problema, consideraría utilizar una única descripción definitiva del tipo de datos o clase, y luego generar código a partir de esa descripción.

La descripción puede ser un archivo fuente de JavaScript; podrías construir un analizador sintáctico que genere el código C# apropiado de ese JS. O bien, podría ser un archivo fuente C#, y tú haces lo contrario.

Puede encontrar más utilidad para describirlo en RelaxNG, y luego construir (o encontrar) un generador para C# y Javascript. En este caso, el esquema de RelaxNG se verificaría en el control del código fuente, y los artefactos generados no lo harían.


EDITAR: También hay una especificación naciente llamada WADL, que creo que ayudaría en este sentido también. No he evaluado WADL. Periféricamente, soy consciente de que no ha tomado al mundo por asalto, pero no sé por qué ese es el caso. There's a question on SO regarding that.


Edit2: Dada la falta de herramientas (WADL está aparentemente mortinatos), si fuera tú probaría este enfoque táctico:

  • Utilice los atributos [DataContract] en su C# los tipos y tratar aquellos como definitivos.
  • crea una herramienta que gandulea en tu tipo C#, desde un ensamblado compilado y ejemplifica el tipo, utilizando el JsonSerializer en un documento XML JSON de muestra, que proporciona una especie de "definición de modelo de objeto" de facto. La herramienta de alguna manera debe verificar que el tipo instanciado pueda realizar un viaje de ida y vuelta en JSON equivalente, tal vez con una suma de comprobación o CRC en el material resultante.
  • ejecute esa herramienta como parte de su proceso de compilación.

Para que esto suceda, usted tiene que comprobar en que "muestra el documento JSON" en el código fuente y también se tendría que asegurarse de que es la forma que estaba utilizando en los diferentes código JS en tu aplicación Dado que Javascript es dinámico, es posible que también necesite un verificador de tipo o algo similar, que se ejecute como parte de jslint u otro paso de verificación de tiempo de compilación, que verifique su fuente de JavaScript para ver si está utilizando sus definiciones de modelo objbect "estándar". .

+0

Gracias, parece una idea interesante utilizar RelaxNG. He estado haciendo algunas cosas con Google Protocol Buffers recientemente, que usa su propio lenguaje para definir una clase como esa para que luego puedas generar las versiones apropiadas para cualquier idioma en el que estés codificando. Es interesante cómo se puede aplicar una idea como esta. en múltiples escenarios y tecnologías diferentes. No puedo creer que no haya pensado en hacer esto antes. –

+0

ya, pensé en protobufs también. Me pregunto si el código generado que sale de un .idl de protobufs se puede utilizar sin el serializador de protobufs. Si es así, podría usar JsonSerializer en .NET, con el código C# que genera la herramienta protobufs. – Cheeso

+0

Así que está sugiriendo que compare una instancia serializada de la clase C# con un documento estático que contenga JSON y que represente mi estructura de datos. Si coinciden, entonces sé que la clase C# es correcta. Luego compararía instancias de la misma clase en JavaScript en el documento JSON y si coinciden, eso verifica que podré intercambiar datos de un cliente a otro sin problemas de serialización y deserialización. –

Cuestiones relacionadas