目前我正在使用的项目没有完全固定的模型(由于外部影响),因此我希望能够灵活地编写它们.目前,它们跨应用程序的三个不同层(db,web api和客户端)进行复制,每个层都有类似的逻辑(即验证).
我想知道是否有一种方法可以让我编写一个模型文件(例如在ruby中),然后让它将该模型转换为必要的c#文件.目前看起来我只是编写了许多可能在任何阶段发生变化的样板代码,而这种生成的方法可以让我专注于更重要的事情.
有没有人有这样的建议,一个dsl /语言我可以做到这一点,并且有没有人有这样的事情的经验?
我见过一个使用部分类和部分方法的系统,可以在不影响自定义代码的情况下重新生成代码.如果您将完全从Visio状态图生成"规则引擎".这基本上是糟糕的勒芒工作流程,但很容易修改.Viso图被导出为XML,使用powershell和T4读入以生成类.
以上示例是外部DSL.IE是应用程序运行的编程语言的外部.另一方面,您可以创建一个内部DSL,它在编程语言中实现和使用.
这篇以及之前关于 Code-Magazine的DSLS的文章非常好.
在上面的链接中,Neal Ford向您展示了如何使用流畅的界面在C#中创建内部DSL.
他还没有提到的一件事是你可以将这个属性[EditorBrowsable(EditorBrowsableState.Never)]放在你的方法上,这样它们就不会出现智能感知.这意味着您可以从DSL的用户隐藏类上的非DSL(如果您愿意)方法,使得更流畅的API更容易被发现.
您可以看到Daniel Cazzulino在撰写带有TDD的IoC容器时,在此视频系列中直接编写了流畅的界面
关于外部DSL的主题,您还可以选择Oslo(目前是CTP),它具有强大的功能,可以让您创建可以直接执行的外部DSL,而不是使用代码生成来实现它根本不是一个DSL.
这可以通过ANTLR轻松完成.如果输出足够相似,您可以简单地使用文本模板机制 - 否则它可以生成一个抽象语法树供您遍历.