2016-01-06 4 views
0

Резюме и вопросКак создать код на основе API Google?

Я ищу для генерации кода в C# для предотвращения значительного повторения и обернуть API Google, таким образом, как они сами, как указано на их .Net Client library page. Редактировать: Their generator написан, по-видимому, на Python. Я продолжу изучение других параметров .Net.

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

Подробности

Я работаю над написанием обертку для API, Google .Net, чтобы сделать библиотеку API Google для PowerShell (для любых и всех Google APIs). Я уже работаю над тремя 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, а также some differences между the two. Я также проверил T4 Text Templates for Visual Studio.

Чтобы было ясно, я не ищет для генерации кода во время выполнения, как я бы с чем-то вроде Reflection, я ищу, чтобы генерировать биты библиотеки - хотя я не уверен, если я ищу active or passive поколения все же.

+1

Посмотрите на шаблоны T4. – SLaks

ответ

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# codegen, а вместо этого просто нацеливаете код генерации, соответствующий документу обнаружения API.

Поэтому я бы предложил базовое текстовое решение и посмотрю, как далеко это может вас достать. Если у вас есть другие вопросы, не стесняйтесь сообщать мне или регистрировать выпуск на GitHub issue tracker.

+0

Спасибо за ответ, Крис. Я знаком с Discovery api, а также о том, как некоторые API отсутствуют (я думаю, что API-интерфейс для контактов не был там, по крайней мере). В настоящее время я пытаюсь склонить голову к тому, чтобы спланировать свой подход. Я ценю ваши идеи, мнения и предложения и могу просто быть в контакте, как только я смогу найти время, чтобы действительно спрятать этот проект. Благодаря! – squid808