我正在构建一个基于插件的重度应用程序。插件通过共享消息总线进行通信。出于几个显而易见的原因,包括类型安全的保证,我最终编写了与此类似的代码:
public class OtherPluginController {
...
public void doSomething(int intParam, String stringParam) {
Command cmd = new Command();
cmd.target = "OtherPlugin";
cmd.name = "doSomething";
cmd.params.put("intParam", intParam);
cmd.params.put("stringParam", stringParam);
MessageBus.emit(cmd);
}
...
}
为了可扩展性和可维护性,现在可以从某种清单文件创建这些控制器,例如上面的示例,并使用XML,如
<Plugin name="OtherPlugin">
...
<Command name="doSomething">
<Parameter name="intParam" type="int"/>
<Parameter name="stringParam" type="String"/>
</Command>
...
</Plugin>
虽然有很多基于模板的框架,但大多数框架似乎都针对不同的用例。我错过了一个框架吗?如果没有,是否有一个框架我至少可以滥用这种东西?
答案 0 :(得分:0)
经过一些额外的研究后,我发现,如果用XML提供“清单”,那么最好也是最简单的方法似乎是XSLT。给出这样的清单文件:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="PluginControllerTemplate.xsl"?>
<Plugin name="OtherPlugin">
<Command name="doSomething">
<Parameter name="intParam" type="int"/>
<Parameter name="stringParam" type="String"/>
</Command>
<Command name="doSomethingElse"/>
</Plugin>
这样的XSL文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:output method="text"/>
<xsl:preserve-space elements="*"/>
<xsl:template match="Plugin" xml:space="preserve">
public class <xsl:value-of select="@name"/>Controller {
<xsl:for-each select="Command">
public void <xsl:value-of select="@name"/>(<xsl:for-each select="Parameter"><xsl:value-of select="@type"/> <xsl:value-of select="@name"/><xsl:if test="position() != last()">, </xsl:if></xsl:for-each>) {
}
</xsl:for-each>
}
</xsl:template>
</xsl:stylesheet>
输出将是
public class OtherPluginController {
public void doSomething(int intParam, String stringParam) {
}
public void doSomethingElse() {
}
}
使用XSLT的主要优点是,您不需要为定义语言定义自己的语法和/或解析器,并且因为它适用于任何浏览器,所以无需任何其他设置即可使用它。但是,如果您希望将代码生成作为IDE的一部分,仍然可以将XSLT集成到eclipse中。