Как мне сгенерировать код на основе Google API?

Резюме и вопрос

Я хочу сгенерировать код на C #, чтобы предотвратить значительное повторение и обернуть API Google так, как они делают сами, как указано в их . Страница клиентской библиотеки Net. Изменить: Их генератор, по-видимому, написан на Python. Я продолжу исследовать другие варианты .Net.

На чем сосредоточить внимание, на CodeDOM, Roslyn или еще на чем-то? Должен ли я вообще не рассматривать генерацию кода - и если да, то какой альтернативный путь мне выбрать, чтобы правильно справиться с этой ситуацией?

Подробности

Я работаю над написанием оболочки для API Google .Net, чтобы создать библиотеку API Google для PowerShell (для всех без исключения API Google). У меня уже есть работа над тремя API-интерфейсами, но поскольку мой проект обрабатывает всю аутентификацию (и ее хранение) и другие вещи, такие как разбиение на страницы, я должен в основном обернуть каждый вызов метода API для работы с моей собственной аутентификацией, чтобы пользователь не нужно об этом беспокоиться. Это приводит к множеству повторяющихся методов инкапсуляции кода, которые уже существуют в библиотеках .Net:

public Data.Asp Get(string userKey, int codeId)
{
    //I have to wrap their get method with my own using GetService(), for example
    return GetService().Asps.Get(userKey, codeId).Execute();
}

Поскольку все это основано на информации, которая существует либо через Google Discovery API, либо через базовые клиентские библиотеки , Я чувствую, что должен быть какой-то способ сгенерировать код и избавить мои руки от некоторых проблем.

Немного предыстории и сопутствующей информации

На главной странице библиотек Google API .Net Client указано:

Исходный код для отдельных API Google создается программно с использованием Discovery API.

Я хотел бы сделать что-то подобное, хотя понятия не имею, на чем сосредоточить свое время и исследования. Я просмотрел CodeDOM ( и присущие ограничения), Roslyn, а также некоторые различия между двое. Я также проверил текстовые шаблоны T4 для Visual Studio.

Чтобы быть ясным, я не хочу генерировать код во время выполнения, как если бы с чем-то вроде Reflection, я хочу сгенерировать биты библиотеки - хотя я не уверен, ищу ли я < генерации href = "https://stackoverflow.com/questions/113286/do-you-create-your-own-code-generators?rq=1"> активного или пассивного пока нет.


person squid808    schedule 06.01.2016    source источник
comment
Посмотрите шаблоны T4.   -  person SLaks    schedule 06.01.2016


Ответы (1)


Я работаю в Google над клиентскими библиотеками .NET (среди прочего). Ваш вопрос довольно далеко идущий, но вот общая идея:

Метаданные для описания «большинства» API Google находятся в документе обнаружения. Здесь описаны методы и типы API.

Клиентские библиотеки для доступа к API Google затем генерируются, как вы указываете, из библиотеки Python. (В частности, с использованием Django в качестве языка шаблонов.)

После создания кода для каждого API Google мы вызываем MSBuild, упаковываем двоичные файлы и развертываем их в NuGet.

Что касается вашего конкретного вопроса о том, как сгенерировать код, я бы рекомендовал вам создать два отдельных компонента. Первый - это что-то, что будет читать и анализировать документ обнаружения, второй - это компонент, который будет выдавать код.

Вот несколько личных мнений относительно генерации кода:

  • Проще всего было бы использовать текстовый язык шаблонов. (например, Django или просто напишите свой.)
  • CodeDOM - интересный выбор, но, вероятно, его гораздо сложнее использовать, чем вы хотите. Это то, как Visual Studio выполняет некоторые из своих кодогенераций, например. вы описываете код, и CodeDOM выдаст C #, VB, MC ++ в соответствии с вашими желаниями. Однако, поскольку вы сосредотачиваетесь только на C #, преимущество CodeDOM, поддерживающего несколько языков, бесполезно.
  • Roslyn, безусловно, классная новая технология, но вряд ли от нее будет много пользы. Я считаю, что Roslyn может динамически моделировать код и передавать AST на диск. Но это, вероятно, излишество, поскольку вы не пытаетесь создать универсальное решение для генерации кода C #, а вместо этого просто нацеливаетесь на генерацию кода, который соответствует документу обнаружения API.

Итак, я бы предложил на данный момент базовое текстовое решение и посмотреть, насколько далеко вы это можете продвинуть. Если у вас есть другие вопросы, напишите мне или запишите проблему в трекере проблем GitHub < / а>.

person Chris Smith    schedule 07.01.2016
comment
Спасибо за ответ, Крис. Я знаком с API Discovery, а также с отсутствием некоторых API (я думаю, что API контактов там не было, по крайней мере). В настоящее время я пытаюсь осмыслить все, чтобы спланировать свой подход. Я ценю ваше понимание, мнения и предложения и, возможно, просто свяжусь с вами, когда у меня будет время по-настоящему взяться за этот проект. Спасибо! - person squid808; 08.01.2016