如何根据Google API生成代码?

时间:2016-01-06 20:11:29

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

摘要和问题

我希望在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库的主页上声明:

  

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

我想做类似的事情,虽然我不知道在哪里集中时间和研究。我在CodeDOM之间查找了Roslyn(以及固有限制),some differences以及the two。我还检查了T4 Text Templates for Visual Studio

要清楚,我希望在运行时生成代码,就像我想要反射一样,我希望生成一些库 - 虽然我不确定我是不是正在寻找active or passive代。

1 个答案:

答案 0 :(得分:1)

我在Google上使用.NET客户端库(除其他外)。你的问题相当广泛,但这是一般性的想法:

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

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

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

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

对于实际的代码,这里有一些个人观点:

  • 最简单的方法是使用基于文本的模板语言。 (例如Django或者只写自己的。)
  • CodeDOM是一个有趣的选择,但可能比你想要的更难使用。这是Visual Studio如何处理其代码,例如你描述了代码,CodeDOM将发出C#,VB,MC ++来满足你的需求。但是,由于您只关注C#,CodeDOM支持多种语言的好处是没有用的。
  • Roslyn当然是一种很酷的新技术,但这可能不会有多大用处。我相信Roslyn能够动态建模代码并将AST往返于磁盘。但这可能有点过头了,因为您并没有尝试构建通用的C#codegen解决方案,而只是生成与API发现文档匹配的代码。

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