2011-11-06 6 views
18

buscando soluciones existentes y comprobadas para generar rápidamente un modelo de objeto del lado del cliente que representa un objeto C# existente. Me imagino que hay una plantilla T4 o algún otro enfoque pero me falta la terminología para encontrarlo. No estoy hablando de la serialización para obtener la representación JSON de una instancia de objeto C# existente o de la deserialización. Simplemente quiero generar el modelo de objetos JavaScript para más de 20 objetos C# y quiero poder volver a generarlos en cualquier momento si el código C# cambia.genera automáticamente el modelo de objetos javascript desde el objeto C#

ejemplo de exceso de simplificación de lo que estoy buscando:

código C#:

[Serializable()] 
public class Cat 
{ 
    public string Name { get; set; } 
    public string Breed { get; set; } 
} 

Javascript modelo de objetos que se genere:

function Cat() 
{ 
    this.Name = ""; 
    this.Breed = ""; 
} 

@Baszz

JSON es un estándar basado en texto para el intercambio de datos y eso no es lo que estoy buscando. Necesito generar una API del lado del cliente de más de 20 objetos que pueda poner en un archivo JavaScript y vincular esa secuencia de comandos a mis diversas páginas web.

El JavaScriptSerializer puede escupir una cadena como por debajo de AC# objeto:

{ "Name": "Hayden", "Breed": "Rabbit” } 

Pero esto no es lo mismo que:

function Cat() 
{ 
    this.Name = ""; 
    this.Breed = ""; 
} 
  1. La cadena JSON no es un nombrado función.
  2. Todos los elementos están entre comillas y en el formato JSON, lo que requeriría un análisis manual de la cadena para ponerla en el formato que necesito.
  3. No puedes nuevo en marcha una instancia de gato, como a continuación debido a la # 1

var = new Mycat gato();

No hay muchos comentarios, así que supongo que todo el mundo lo hace a mano o no lo hace en absoluto. Buscando crear mi propia plantilla T4 para analizar los archivos C# y generar mis API del lado del cliente.

+0

Una idea interesante, podría ayudar a las personas que intentan proporcionar respuestas si explican lo que está tratando de lograr con este enfoque. Por ejemplo, qué/cómo se usan estos objetos. –

+1

Hola, encontré tu pregunta cuando pensaba en escribir una similar y me pregunto si podemos tratar de hacer esto más genérico y satisfactorio. Ambos. Esto es lo que quiero. Tengo una API REST realizada con Entity Framework y MVC4, todas con buenas pruebas automáticas. Ahora, quiero crear una biblioteca de JavaScript que se utilizará desde el cliente para llamar a estos servicios. Disfrutaré de no tener que escribir el javascript directamente, sino generarlo automáticamente a partir de la API y el modelo de objetos. Por supuesto, sé que esto se puede hacer con reflexión y esta es la dirección por la que puedo ir por ahora. Pero, encontrar esto hecho sería mejor – pabloelustondo

Respuesta

5

Después de innumerables búsquedas, no pude encontrar nada parecido a lo que estoy buscando. Claramente, todos están atrapados en la palabra de moda de JSON en los últimos años y nadie está autogenerando modelos de objetos del lado del cliente. Miré a Codesmith y en las plantillas de T4. Tampoco tiene ningún mecanismo incorporado para analizar archivos de código. Ambos requieren que te sumerjas en la reflexión para obtener propiedades y sus tipos, que descansan al 100% en los hombros de los desarrolladores. Lo que plantea la pregunta una vez que saltas ese aro de escribir todo ese código de reflexión, ¿qué beneficio te dan las plantillas de Codesmith o T4? Absolutamente nada. También te importa colocar tu código de reflexión en una biblioteca de clases reutilizable y llamarlo desde la aplicación de la consola y eso es exactamente lo que hice.

0

No estoy seguro si podría entender de lo que está hablando, pero si usa Reflection puede obtener datos sobre el código C# para generar información para el objeto javascript.

2

Ésta es una pregunta más, pero se puede tratar sharp2Js. Es una biblioteca diseñada para reflejar en sus clases y generar objetos javascript con un par de funciones de utilidad.

Correr contra el ejemplo que nos ha facilitado (y la salida de la cadena que produce en una plantilla T4 o de otra manera):

string modelOutput = Castle.Sharp2Js.JsGenerator. 
      GenerateJsModelFromTypeWithDescendants(typeof(Cat), true, "example"); 

Produce:

example = {}; 

example.Cat = function (cons, overrideObj) { 
    if (!overrideObj) { overrideObj = { }; } 
    if (!cons) { cons = { }; } 
    var i, length; 
    this.name = cons.name; 
    this.breed = cons.breed; 


    this.$merge = function (mergeObj) { 
     if (!mergeObj) { mergeObj = { }; } 
     this.name = mergeObj.name; 
     this.breed = mergeObj.breed; 
    } 
} 

Los metadatos extra en no es un andamio para admitir colecciones y tipos complejos con la capacidad de crear objetos heredados para anular el comportamiento, etc.

Nota: Yo soy t El mantenedor de sharp2Js, y es nuevo y no hace mucho todavía, pero tal vez pueda ayudar con escenarios como el tuyo.

Cuestiones relacionadas