相互依赖的语言包装器的设计模式

时间:2010-06-30 18:56:27

标签: c# xml

因此,用于创建结构化XML,其中结构是通过某种类结构定义的。是否有一个很好的设计模式来包装语言,以便只能定义操作?

每个项目都包含自己的XElement)

  • MSBuildDoc(文档生成器)
  • MSBuildTarget(目标)
  • MSBuildMessageTask
  • MsBuildCallTask​​
  • MsBuildBuildTask
  • MSBuildTaskOutputElement

我正在尝试构建一个框架,使得孤立无法实现,只有有效的组合可以工作,有效的组合可以从项目的实例中移动。

相互依赖的原因在于使用Add(common interface or superclass)AddAfterSelf(common interface or superclass)等方法需要已经创建了子/兄弟。如果构造函数是公共的,那么您可以直接创建一个孤儿。

示例:

var msb=new MSBuildDoc();
var mainTarget=new MSBuildtarget(); //created as orphan
msb.Add(mainTarget); // add is free to accept anything even invalid child types

使用Create方法(静态或非静态)会直接创建孤儿。

使用AddSubType方法需要subType的实现细节(构建它所需的内容)才能在父级上生效。

示例:

var x=new MSBuildDoc();
var mainTarget=x.AddTarget("Main") //AddTarget method is defined in the parent class
  .SetAttributeFluent("BuildInParallel","true");
mainTarget.AddBuildTask(alltargets);

我意识到制作一个详尽的包装几乎是毫无意义和荒谬的。我试图将我在项目中使用的极少部分包装起来,以便核心类具有可读性和可维护性。

1 个答案:

答案 0 :(得分:0)

您可以简单地要求每种类型的构造函数都需要一个父节点参数:

var msb = new MSBuildDoc(); 
var mainTarget = new MSBuildtarget( msb ); // constructor calls msb.Add(m_XElem)

当您想要避免孤立对象时,此模式并不罕见。或者,您可以使用完整的builder pattern,并进行类型构建并返回其潜在的孩子。