5

在使用 Visual Studio 2008 进行 C# 编程时,我经常希望“自动”生成代码。如果可能的话,我想通过调用 Rake 调用我的 MSBuild 解决方案文件来实现它,它会调用 Ruby 代码来生成代码,生成的文件会自动出现在我的解决方案中。

这是一个商业示例(我可以说出许多可能的示例),这种自动代码生成将很有帮助。在最近的一个项目中,我有一个接口,其中包含一些包含美元金额的属性。我想要第二个接口和第三个接口,它们具有与第一个接口相同的属性,除了它们被“限定”为业务单位名称。像这样的东西:

public interface IQuarterlyResults
{
     double TotalRevenue { get; set; }
     double NetProfit { get; set; }
}

public interface IConsumerQuarterlyResults
{
     double ConsumerTotalRevenue { get; set; }
     double ConsumerNetProfit { get; set; }
}

public interface ICorporateQuarterResults
{
     double CorporateTotalRevenue { get; set; }
     double CorporateNetProfit { get; set; }
}

在此示例中,有一个“消费者业务单位”和一个“公司业务单位”。IQuarterlyResults 上的每个属性都成为 ICorporateQuarterlyResults 上名为“Corporate”+ [属性名称] 的属性,对于 IConsumerQuarterlyResults 也是如此。

为什么要为这些创建接口,而不仅仅是为 Consumer 提供一个 IQuarterlyResults 实例,为 Corporate 提供另一个实例?因为,在使用我正在构建的计算器对象时,用户必须处理 100 个属性,如果他可以处理“完全限定”的属性名称,例如“ConsumerNetProfit”,那么混淆就会少得多。

但我们不要在这个例子中陷入困境。这只是一个例子,而不是主要问题。

主要问题是:我喜欢使用 Ruby 和 ERB 进行代码生成,我喜欢使用 Rake 来管理任务之间的依赖关系。为了解决上述问题,我想做的是让 MSBuild 调用 Rake,并让 Rake / Ruby 读取“核心”接口上的属性列表,然后生成代码以生成所有依赖接口及其特性。这会在我每次构建时触发,因为我将它放入 VS.NET 解决方案的 MSBuild 文件中。

有没有人尝试过这样的事情?你的效果如何?您可以分享哪些关于利弊、成功秘诀等方面的见解?

谢谢!

4

3 回答 3

1

我使用 rake 生成使用 ERB 模板化的配置文件。要做的是编辑您的项目文件以插入一个调用 rake 的 BeforeBuild 目标,类似于:

<Target Name="BeforeBuild">
     <Exec Command="rake name_of_my_template_processing_task" />
</Target>

请参阅msbuild exec 任务文档关于预构建事件的博文。您需要在 Command 属性中:

  • 如果它不在路径环境变量中,则提供 rake 的路径
  • 如果需要从特定目录运行,请设置工作目录属性
  • 如果您没有从项目所在的目录执行 rake,请提供 -r 参数和 rakefile 的路径。
于 2010-04-03T13:32:51.133 回答
1

我们使用 Nant/ruby+ERB 实现了它——它在我们的 DAL 和我们的 Web 应用程序的数据输入表单输入中生成了一种 CRUD 的音调。对我们来说它工作得非常好,但一开始有大量的设置时间让我的老板/客户感到紧张,因为他们认为我们应该展示更多的产品而不是原型。

还要确定生成在做什么 - 生成和修改和生成+集成之间存在差异。生成和修改更像是使用向导并且是一次性的。当您生成+集成时,您需要了解您将在何处/如何通过继承或通过从手写代码到生成代码的库调用来利用生成的代码。

Ruby/erb 执行速度不快。确定何时需要/不需要生成的方法很有帮助,因为编译周期开始变得漫长且无效率。我们还发现,在将其集成到工作流程之前,始终构建一个小型测试用例以生成甚至一组工件很有帮助 - 您对产品进行了测试,并且在您处理 cg 元素时它不会减慢任何人的速度(s )。

我会阅读 Jack Herringtons Code Generation in Action,因为它面向 Ruby。它让我进入了CG。

我还将阅读Microsoft .NET 中的Kathleen Dollards代码生成。它是为使用 XSLT 而构建的,但开发元数据、转换和集成阶段的原则是相同的。她的文章也很有帮助,您可以在杂志和网络上找到。

于 2009-03-24T20:47:05.063 回答
0

我想把它扔在那里(虽然我怀疑它会成为问题的答案,它应该是信息),但是有几个很好的 CodeGen 工具具有一些非常强大的 Visual Studio 集成,可以做很多事情你想要什么。显然,您正在寻找 Ruby 工具,但对于那些不熟悉 Ruby 的人,请考虑其他一些工具:

于 2009-04-03T16:39:17.537 回答