实用模式:内部域特定语言
2010-09-30 22:42:30 来源:WEB开发网我需要构建运行时行为以及尽可能清晰地表达 DSL 用户意图的 DSL。根据我的经验,非常有必要将运行时行为划分为“语义模型”,该模型由 Martin Fowler 定义为“由 DSL 填充的域模型”(martinfowler.com/dslwip/SemanticModel.html)。
上一个代码段的主要特点是它不执行任何实际操作。这一小段 DSL 代码只负责配置 IoC 容器的语义模型。您可以略过上述 fluent 界面,自行构建语义模型对象,如下所示:
var graph = new PluginGraph();
PluginFamily family = graph.FindFamily(typeof(ISendEmailService));
family.SetScopeTo(new HttpContextLifecycle());
Instance defaultInstance = new SmartInstance<SendEmailService>();
family.AddInstance(defaultInstance);
family.DefaultInstanceKey = defaultInstance.Name;
var container = new Container(graph);
在运行时行为中,注册表 DSL 代码和正上方的代码完全相同。DSL 只是创建 PluginGraph、PluginFamily、Instance 和 HttpContextLifecycle 对象的对象图表。因此,问题也就出现了,为什么还要费事地使用两个单独的模型?
首先,作为一名用户,我的确需要上述两个代码示例的 DSL 版本,因为仅需要编写很少的代码就能够更加清晰地表达我的意图,并且不需要非常了解 StructureMap 的内部信息。作为 StructureMap 的实施者,我需要一种简单的方式来构建并测试小型单元中的功能,而使用 fluent 界面本身来完成此任务则比较困难。
使用语义模型这种方法,我能够非常轻松地构建行为类并对其进行单元测试。DSL 代码本身非常简单,因为它的唯一用途就是配置语义模型。
更多精彩
赞助商链接