#javascript #object #model
#javascript #объект #Модель
Вопрос:
Ищем существующие, проверенные решения для быстрого создания клиентской объектной модели javascript на стороне клиента, которая представляет существующий объект c #. Я полагаю, что существует шаблон T4 или какой-либо другой подход, но мне не хватает терминологии, чтобы его найти. Я не говорю о сериализации, чтобы получить представление JSON существующего экземпляра объекта c # или что-либо связанное с десериализацией. Я просто хочу сгенерировать объектную модель javascript для более чем 20 объектов c #, и я хочу иметь возможность повторно генерировать их в любой момент, если код c # изменится.
Чрезмерно упрощенный пример того, что я ищу:
C # код:
[Serializable()]
public class Cat
{
public string Name { get; set; }
public string Breed { get; set; }
}
Объектная модель Javascript, которая будет сгенерирована:
function Cat()
{
this.Name = "";
this.Breed = "";
}
@Baszz
JSON — это текстовый стандарт для обмена данными, и это не то, что я ищу. Мне нужно сгенерировать клиентский API из более чем 20 объектов, которые я могу поместить в файл javascript и связать этот скрипт с моими различными веб-страницами.
JavaScriptSerializer может выдавать строку, подобную приведенной ниже, из объекта c #:
{ "Name": "Hayden", "Breed": "Rabbit” }
Но это не то же самое, что:
function Cat()
{
this.Name = "";
this.Breed = "";
}
- Строка JSON не является именованной функцией.
- Все элементы заключены в кавычки и в формате JSON, что потребовало бы ручного разбора строки, чтобы привести ее к нужному мне формату.
- Вы не можете создать экземпляр Cat, как показано ниже, из-за # 1
var myCat = новый Cat();
Комментариев не так много, поэтому я предполагаю, что все делают это вручную или вообще не делают. Рассматриваю возможность создания моего собственного шаблона T4 для анализа файлов c # и генерации моего клиентского API.
Комментарии:
1. Интересная идея, это может помочь людям, пытающимся дать ответы, если вы объясните, чего вы пытаетесь достичь с помощью этого подхода. Например, что / как используются эти объекты.
2. Привет, я нашел ваш вопрос, когда думал о написании аналогичного, и мне интересно, можем ли мы попытаться сделать это более общим и удовлетворить. Оба. Это то, что я хочу. У меня есть REST API, выполненный с Entity Framework и MVC4, все с хорошими автоматическими тестами. Теперь я хочу создать библиотеку javascript, которая будет использоваться из ly client для вызова этих служб. Мне понравится не писать javascript напрямую, а автоматически генерироваться из API и объектной модели. Конечно, я знаю, что это можно сделать с помощью reflection, и это направление, в котором я могу пойти сейчас. Но, найдя это сделанным, было бы лучше
Ответ №1:
После бесчисленных поисков я не смог найти ничего близкого к тому, что я ищу. Очевидно, что за последние несколько лет все увлеклись модным словом JSON, и никто не автоматически генерирует объектные модели на стороне клиента. Я посмотрел на Codesmith и на шаблоны T4. Ни один из них не имеет встроенных механизмов для разбора файлов кода. Оба требуют, чтобы вы переходили к отражению, чтобы получить свойства и их типы, которые на 100% ложатся на плечи разработчиков. Возникает вопрос, как только вы преодолеете этот цикл написания всего этого кода отражения, какую выгоду дают вам шаблоны Codesmith или T4? Абсолютно ничего.. Вы также можете поместить свой код отражения в библиотеку классов, которую можно использовать повторно, и вызвать ее из консольного приложения, и это именно то, что я сделал.
Ответ №2:
Это более старый вопрос, но вы могли бы попробовать sharp2Js. Это библиотека, предназначенная для отражения ваших классов и генерации объектов javascript с помощью нескольких служебных функций.
Запустите ее в соответствии с предоставленным вами примером (и выведите строку, которую она создает в T4
шаблоне или иным образом):
string modelOutput = Castle.Sharp2Js.JsGenerator.
GenerateJsModelFromTypeWithDescendants(typeof(Cat), true, "example");
Создает:
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;
}
}
Дополнительные метаданные содержат некоторые строительные леса для поддержки коллекций и сложных типов с возможностью создания унаследованных объектов для переопределения поведения и т.д.
Примечание: я являюсь разработчиком sharp2Js
, и это новое и пока мало что делает, но, возможно, это может помочь в сценариях, подобных вашему.
Ответ №3:
Я думал о той же идее, и я немного поискал об этом, я нашел эту ссылку, может быть, это полезно: http://igorshare.wordpress.com/2012/08/20/roslyn-c-is-cheating-on-me-with-javascript-or-how-to-compile-c-into-javascript/
Ответ №4:
Я не уверен, что смог понять, о чем вы говорите, но если вы используете отражение, вы можете получить данные о коде C # для генерации информации для объекта javascript.