2

我已经推迟使用生成的代码作为构建过程的一部分,因为担心它会在构建过程中引入复杂性。

有没有一种简单的方法可以将构建时生成的代码集成到应用程序中?

我正在考虑的代码类型类似于Visual Studio 执行的资源和设置文件代码生成:

  • 这里有智能感知很有价值
  • 有很多属性和属性之间的联系很容易描述,但在 C# 中却无法简洁地实现。
  • 底层资源是可修改的,代码会自动重新生成,无需任何用户交互,也无需了解生成器的内部结构。

对于(非现实世界)示例,考虑一个预编译器,它通过类似命名的 C# 属性(或方法)生成对 Regex 的命名捕获组的访问器。这是我想要生成的典型的东西:样板包装的长片段,其主要功能是启用编译时检查错误(在上面;访问不存在的捕获组或编写和无效的正则表达式)并且没有不太重要的是,这些属性的智能感知。最后,团队中的其他人应该可以轻松使用此设置只有最低限度的学习曲线。即,要求人工干预来重新生成代码是绝对不可接受的,也不可接受将生成的代码提交到源代码控制中。在最坏的情况下,每个人都应该只需要安装一些扩展;理想情况下,扩展应该可以安装到源树中,这样任何签出树的人都可以在没有任何介绍的情况下构建项目。

要使其正常工作,IDE 集成必须非常出色:更新底层“资源”定义文件应该触发 代码的重新生成,而无需任何用户交互,理想情况下,生成器本身将易于稍后为其他开发人员维护(即一些生成器调试能力是一个加号)。

最后,可以将相同模板应用于各种输入资源的类似 XSLT 的方法是理想的;既因为这意味着如果您只想更新资源,您甚至不需要查看实际的生成器代码,并且因为它使模板重用变得微不足道。

我看过 T4,但据我所知,这有一种不太方便的类似 ASP 的方法,其中模板和资源没有被干净地分割(即,生成器负责查找资源 - 这使得模板重用变得不那么容易)。

是否有更好(更清洁)的解决方案或某种运行 T4 的方式,以便可以轻松地重用相同的模板并且(很像 .NET 设置文件)资源的任何更新都会自动触发已实现代码的重新生成?

摘要: 我正在寻找一种可以

  1. 当底层资源(不是模板!)发生变化时,无需开发人员干预即可自动重新生成代码。
  2. 维护起来有点简单
  3. 能够在多个资源之间共享相同的生成器模板(第 1 点可能意味着资源应该引用生成器,反之亦然)。
4

2 回答 2

6

您可以使用T4 Toolbox中的 T4ScriptFileGenerator 。将“资源”文件的“自定义工具”属性更改为 T4ScriptFileGenerator 并保存更改。自定义工具将生成一个新的空 T4 脚本(.tt 文件)。将您的代码生成逻辑放在这个 .tt 文件中。每当您修改(并保存)资源文件时,T4ScriptFileGenerator 将使用 .tt 文件生成输出代码。有关其工作原理的示例,请参阅 T4 工具箱中的“LINQ to SQL 模型”生成器,它使用 .dbml 文件作为“资源”。在此生成器创建的 .tt 文件中,您将看到所有代码生成逻辑都位于单独的 .tt 文件中,并在包含指令的帮助下被重用。

于 2009-11-12T14:46:46.320 回答
0

您可能需要关注 ABSE ( http://www.abse.info )。ABSE 是一种代码生成和模型驱动的软件开发方法,它在平台和语言方面完全不可知,因此您可以轻松创建自己的 C# 生成器和您想要的任何其他东西。最大的好处是您可以完全按照您想要的方式生成代码。不利的一面是,您可能首先需要做更多工作来构建模板。

ABSE 允许您将您的领域知识捕获到“原子”中,这些原子基本上是您可以构建的更大模型的片段。ABSE 既是声明性的又是可执行的。该模型能够根据您的规范生成代码,并在模型级别合并自定义代码。

不幸的是,ABSE 仍在进行中,集成开发环境(名为 AtomWeaver)仍在制作中。无论如何,生成器的 CTP 版本计划在 2010 年 1 月发布,所以我们已经接近它了。

于 2009-11-15T22:42:04.770 回答