【问题标题】:How would I generate code based on the Google API?我将如何生成基于 Google API 的代码?
【发布时间】:2016-01-08 07:41:08
【问题描述】:

总结和问题

我希望在 C# 中生成代码以防止大量重复,并以他们自己的方式包装 Google API,如他们的.Net Client library page 所述。 编辑:Their generator 显然是用 Python 编写的。我将继续研究其他 .Net 选项。

我应该把注意力集中在哪里,CodeDOM、Roslyn 还是其他?我应该根本不考虑代码生成吗?如果是,我应该采取什么替代方法来正确处理这种情况?

详情

我正在为 Google .Net API 编写一个包装器,以便为 PowerShell(适用于任何和所有 Google API)制作一个 Google API 库。我已经让它在三个 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 库的主页上写着:

各个 Google API 的源代码是使用 Discovery API 以编程方式生成的。

我想做类似的事情,但我不知道把时间和研究重点放在哪里。我查过CodeDOM(和固有限制)、Roslyn 以及the two 之间的some differences。我还查看了T4 Text Templates for Visual Studio

明确地说,我希望像使用反射之类的东西那样在运行时生成代码,我希望生成一些库的位 - 尽管我不确定我是否正在寻找active or passive代呢。

【问题讨论】:

  • 查看 T4 模板。

标签: c# .net roslyn google-api-dotnet-client codedom


【解决方案1】:

我在 Google 工作,负责 .NET 客户端库(除其他外)。您的问题影响深远,但总体思路如下:

用于描述“大多数”Google API 的元数据是通过发现文档。它描述了 API 具有的方法和类型。

然后,正如您所指出的,用于访问 Google API 的客户端库是从 Python 库生成的。 (特别是使用 Django 作为模板语言。)

为每个 Google API 生成代码后,我们调用 MSBuild,打包二进制文件并将它们部署到 NuGet。

至于您关于如何生成代码的具体问题,我建议您构建两个单独的组件。第一个是读取和解析发现文档的东西,第二个是发出代码的组件。

对于实际的代码生成,以下是一些个人意见:

  • 最简单的做法是使用基于文本的模板语言。 (例如 Django 或自己编写。)
  • CodeDOM 是一个有趣的选择,但使用起来可能比您想要的要困难得多。这就是 Visual Studio 的一些代码生成方式,例如您描述代码,CodeDOM 将发出 C#、VB、MC++ 以满足您的需求。但是,由于您只关注 C#,因此 CodeDOM 支持多种语言的好处并没有用处。
  • Roslyn 无疑是一项很酷的新技术,但它可能没有多大用处。我相信 Roslyn 有能力对代码进行动态建模并将 AST 往返传输到磁盘。但这可能有点过头了,因为您并没有尝试构建通用的 C# 代码生成解决方案,而只是针对生成与 API 发现文档匹配的代码。

所以我现在建议一个基本的基于文​​本的解决方案,看看它能让你走多远。如果您有任何其他问题,请随时给我发消息或在GitHub issue tracker 上记录问题。

【讨论】:

  • 谢谢你的回答,克里斯。我熟悉 Discovery api 以及一些 API 是如何丢失的(我认为 Contacts API 至少不在其中)。我目前正试图围绕一些事情来计划我的方法。我很欣赏你的见解、意见和建议,一旦我能找到时间真正投入这个项目,我可能会与你联系。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-04-21
  • 2011-07-20
  • 2017-06-06
  • 1970-01-01
  • 2010-11-20
  • 2016-02-01
  • 2012-08-20
  • 2011-11-27
相关资源
最近更新 更多