我希望有一个可以在隔离环境中开发的模块,但仍然是一个可以插入anoter项目的模块。
这个想法:目前我有状态机驱动的模块化项目,其中每个模块都由DSL定义,因此主项目有其上下文和命令映射和状态机。现在,其中一个模块将基本上变成同一个东西 - 它将拥有自己的上下文,自己的子模块和自己的DSL定义,它们将与主要上下文分离。
答案 0 :(得分:1)
所以我假设解决这个问题的最好方法是创建一个独立的通信模块,它将映射到“子”DSL中,然后“父”模块将通过“子汇编程序”的核心工厂找到它。并通过它触发事件。它还使通信更具可测性,因为它可以通过一个点轻松测试/模拟/观察整个通信,并且还抽象出“父”应用程序的实现和事件
答案 1 :(得分:1)
HexMachina仅支持应用程序的一个上下文(将来应支持父子上下文)。我不确定你究竟想要什么,但是从一些事情开始吧。
模块有两个调度程序,一个用于与FrontController进行内部通信,另一个用于所有外部通信。 要在模块之间进行通信,一个模块必须订阅另一个模块。在DSL中,它定义如下:
<chat id="chat" type="hex.ioc.parser.xml.mock.MockChatModule">
<listen ref="translation"/>
</chat>
<translation id="translation" type="hex.ioc.parser.xml.mock.MockTranslationModule">
<listen ref="chat">
<event static-ref="hex.ioc.parser.xml.mock.MockChatModule.TEXT_INPUT" method="onSomethingToTranslate"/>
</listen>
</translation>
在此示例中,当聊天模块dispatchPublicMessage(MockChatModule.TEXT_INPUT, [“data”])
时,执行翻译模块的onSomethingToTranslate(textToTranslate : String)
方法。
您可以使用上下文包含和条件属性来按“组件”组织DSL文件,并定义在编译时要使用的内容。
<root name="applicationContext">
<include if=“useModuleA” file="context/ModuleA.xml"/>
</root>
条件属性值由编译器标志(-D useModuleA=1
)定义,或直接在代码中检查此link。
如果您希望在一次状态更改中驱动多个模块,则使用命令来管理它。
<state id="assemblingEnd" ref="applicationContext.state.ASSEMBLING_END">
<enter command-class="hex.ioc.parser.xml.assembler.mock.MockStateCommand" fire-once="true"/>
</state>
我希望这可以帮到你。如果您想了解更多细节,请与我们联系。