Language agnostic 业务对象的特定于域的语言?
我正在考虑编写一种领域特定语言(DSL)来为业务对象建模。DSL将不会被执行,而是由基于模板的代码生成器(可能是CodeSmith)使用它来生成.NET和SQL DSL将需要支持以下元素的定义:Language agnostic 业务对象的特定于域的语言?,language-agnostic,code-generation,Language Agnostic,Code Generation,我正在考虑编写一种领域特定语言(DSL)来为业务对象建模。DSL将不会被执行,而是由基于模板的代码生成器(可能是CodeSmith)使用它来生成.NET和SQL DSL将需要支持以下元素的定义: 类别(名称和说明) 属性(名称、友好名称、类型、空/非空) 简单验证(必需、正则表达式、范围等) 类之间的关系(1到1、1到多、多到多) 继承(好的,可能在版本2中) 下面是一个DSL代码的简单示例: Class: Insured Desc: "Represents a person cover
- 类别(名称和说明)
- 属性(名称、友好名称、类型、空/非空)
- 简单验证(必需、正则表达式、范围等)
- 类之间的关系(1到1、1到多、多到多)
- 继承(好的,可能在版本2中)
Class: Insured
Desc: "Represents a person covered by an insurance policy"
Prop: FirstName, "First Name", String(20), not null
Prop: LastName, "Last Name", String(20), not null
Prop: MailAddress, "Mailing Address", Address, not null
Prop: SSN, "Social Security Number", String(9), null
Rule: RegEx, SSN, ^\d{9}$
Class: Address
Prop: Line1, "Line 1", String(30), not null
Prop: City, "City", String(30), not null
Prop: State, "State", String(2), not null
...
为了使DSL保持简单,更复杂的验证规则将用目标语言编码。当前的计划是禁止生成代码,并将更复杂的规则添加到子类中
有人写过类似的东西吗?您可以提供类似解决方案的提示或链接吗?建议您看一看,如果只是为了避免重新创建它。建议您看一看,如果只是为了避免重新创建它。自动将您呈现的结构转换为XML非常容易。从这里开始,我设想可以通过XSLT或XQuery编写某种转换,转换成您想要的任何最终结果。我编写了一个名为visualstudio的外接程序,以便于进行转换
如果您真的想编写自己的解析器,我建议您查看现有的文本DSL解决方案,例如。自动将呈现的结构转换为XML非常容易。从这里开始,我设想可以通过XSLT或XQuery编写某种转换,转换成您想要的任何最终结果。我编写了一个名为visualstudio的外接程序,以便于进行转换 如果您真的想编写自己的解析器,我建议您查看现有的文本DSL解决方案,例如。我有一个项目,名为,在创建将用户故事建模为C#接口和单元测试的DSL时,我使用了框架的一部分 示例输入的一部分:
begin story "AUserStory":
begin setup
@Person to have a ~Spouse(@Person)
~IsActive(true)
~Age(0)
~IsDead(false)
and several ~Children(@Person)
and a ~Location(@Location)
I want a @Person to be able to #Kill another @Person
I want a @Person to be able to #Marry another @Person
I want to be able to #Find all @Person
@Location to have a ~Latitude(0.0)
and a ~Longitude(0.0)
end setup
相应生成的C#代码:
[PluginFamily(“bdUnit”)]
公共接口IPerson
{
IPerson{get;set;}
布尔是活动的{get;set;}
int Age{get;set;}
bool IsDead{get;set;}
IList子项{get;set;}
ILocation位置{get;set;}
无效终止(IPerson用户);
void Marry(IPerson用户);
void Find();
}
[插件家庭(“bdUnit”)]
公共接口定位
{
十进制纬度{get;set;}
十进制经度{get;set;}
}
我在dll中编译接口和测试,因此它们是“禁止使用的”。这些接口只能在继承类中实现。然后,我使用将所需的依赖项注入到单元测试中。我有一个名为的项目,其中我使用框架的部分内容创建了一个DSL,该DSL将用户情景建模为C#接口和单元测试
示例输入的一部分:
begin story "AUserStory":
begin setup
@Person to have a ~Spouse(@Person)
~IsActive(true)
~Age(0)
~IsDead(false)
and several ~Children(@Person)
and a ~Location(@Location)
I want a @Person to be able to #Kill another @Person
I want a @Person to be able to #Marry another @Person
I want to be able to #Find all @Person
@Location to have a ~Latitude(0.0)
and a ~Longitude(0.0)
end setup
相应生成的C#代码:
[PluginFamily(“bdUnit”)]
公共接口IPerson
{
IPerson{get;set;}
布尔是活动的{get;set;}
int Age{get;set;}
bool IsDead{get;set;}
IList子项{get;set;}
ILocation位置{get;set;}
无效终止(IPerson用户);
void Marry(IPerson用户);
void Find();
}
[插件家庭(“bdUnit”)]
公共接口定位
{
十进制纬度{get;set;}
十进制经度{get;set;}
}
我在dll中编译接口和测试,因此它们是“禁止使用的”。这些接口只能在继承类中实现。然后,我使用将所需的依赖项注入单元测试。嗯,它来自Java世界,但是使用Eclipse项目TMF Xtext,这样的任务将在几分钟内完成。
查看他们的主页,我提供了非常类似的示例。嗯,它来自Java世界,但是使用Eclipse项目TMF Xtext,这样的任务将在几分钟内完成。
查看他们的主页,我提供了非常类似的示例。谢谢链接。乍一看,它似乎比我要找的要复杂得多,但我会继续读下去。谢谢你的链接。乍一看,它似乎比我想要的要复杂得多,但我会继续读下去。事实上,MPS不是基于文本的。但它仍然是我见过的最好的DSL编程系统。事实上,MPS不是基于文本的。但它仍然是我见过的最好的DSL编程系统。