目前我正在处理的项目没有完全固定的模型(由于外部影响),因此我希望在编写它们时具有一定的灵活性。目前,它们被复制到应用程序的三个不同层(数据库、Web API 和客户端),并且每个层都有相似的逻辑(即验证)。

我想知道是否有一种方法可以让我编写一个模型文件(比如用 ruby​​),然后让它将该模型转换为必要的 c# 文件。目前,我似乎只是编写了很多可能在任何阶段发生变化的样板代码,而这种生成的方法将使我能够专注于更重要的事情。

有没有人对这样的事情有推荐,我可以用一种 dsl/语言来做到这一点,并且有人对这样的事情有任何经验吗?

有帮助吗?

解决方案

此可以与 ANTLR 轻松完成。如果输出类似的话,你可以简单地使用文本模板机制,否则就产生一个抽象语法树为您遍历。

其他提示

我见过一个系统,它使用部分类和部分方法来允许重新生成代码而不影响自定义代码。如果您愿意的话,“规则引擎”完全是从 Visio 状态图生成的。这基本上是穷人的工作流程,但很容易修改。Viso 图导出为 XML,使用 powershell 和 T4 读取该 XML 以生成类。

上面的示例是外部 DSL。IE。应用程序运行所用的编程语言的外部。另一方面,您可以创建一个在编程语言中实现和使用的内部 DSL。

这个和上一个 关于 DSLS 的文章 Code-Magazine 的内容相当不错。

在上面的链接中,Neal Ford 向您展示了如何使用流畅的界面在 C# 中创建内部 DSL。

他还没有提到的一件事是,您可以将此属性 [EditorBrowsable(EditorBrowsableState.Never)] 放在您的方法上,这样它们就不会出现智能感知。这意味着您可以向 DSL 用户隐藏类上的非 DSL(如果您愿意)方法,从而使 Fluent API 更容易被发现。

您可以在本视频系列中看到实时编写的流畅界面 丹尼尔·卡祖里诺 使用 TDD 编写 IoC 容器

关于外部 DSL 的主题,您还可以选择 奥斯陆(目前为 CTP) 它非常强大,能够让您创建可以直接执行的外部 DSL,而不是使用代码生成,因为代码生成实际上根本不是 DSL。

我认为你是在正确的轨道上。

我通常做在这样的情况下是设计一种简单的语言,抓住我的需求和写LL1(递归下降)分析器它。

如果该语言必须具有非平凡的C#语法在它,我既可以引用的是,或者只是把它包在我可以识别括号,只是使其通过,以输出代码。

我既可以有它生成解析树的结构,并产生表示3种不同的代码从,或我可以有它的飞行使用模式变量与3个值生成的代码,或者,或者只是同时写代码以3个不同的输出文件。

不止一种方法去做一件事。如果你怕写作解析器(如一些程序员),还有其他地方所以很多的帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top