如何在模块中使用模块

时间:2016-11-09 08:35:46

标签: haxe hexmachina

我希望有一个可以在隔离环境中开发的模块,但仍然是一个可以插入anoter项目的模块。

这个想法:目前我有状态机驱动的模块化项目,其中每个模块都由DSL定义,因此主项目有其上下文和命令映射和状态机。现在,其中一个模块将基本上变成同一个东西 - 它将拥有自己的上下文,自己的子模块和自己的DSL定义,它们将与主要上下文分离。

  • 这可能吗?
  • 是否有一些关于如何自动将事件从主要上下文通过模块转发到模块上下文的最佳实践?
  • 有没有办法将模块私有调度程序映射为隔离上下文的调度程序?

2 个答案:

答案 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

您可以使用上下文包含和条件属性来按“组件”组织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>

我希望这可以帮到你。如果您想了解更多细节,请与我们联系。