【问题标题】:How should Prism modules know about each other's views?Prism 模块应该如何了解彼此的观点?
【发布时间】:2020-05-23 13:55:01
【问题描述】:

我对 Prism 中的模块非常陌生,并且正在努力了解如何正确使用它们。我想要一个如下图所示的导航面板,这是我从谷歌那里偷来的。

假设我有 3 个模块用于 3 个独立的关注点:NavigationModuleHelpModuleFeedbackModule。如果我想在应用首次加载时显示“帮助”,我的理解是我会执行以下操作:

  1. 在我的 Shell(主 WPF 项目)中为导航和内容定义区域
  2. 执行时,将导航视图加载到导航区域中
  3. NavigationModule 初始化后,将HelpModule 中的视图加载到主要内容区域中

这给我留下了几个关于哪些模块应该相互了解的问题:

  1. Shell 的项目是否应该引用NavigationModule 以加载其视图?
  2. NavigationModule 是否应该引用HelpModule 以加载其视图?并引用FeedbackModule 以便按需加载其视图?

如果这些问题的答案是“否”,那么模块了解彼此观点的最佳方式是什么?我可以为视图名称创建一个带有常量的共享类库,但是以这种方式维护一堆字符串似乎有点麻烦,而对于引用我可以使用nameof()。我会很感激任何方向。谢谢。

【问题讨论】:

    标签: wpf prism


    【解决方案1】:

    从一个模块到另一个模块的项目引用的意义上,模块不应该相互“了解”,因为这种方式首先会破坏从拥有模块中获得的任何东西,也就是说,拥有一个 modular 应用程序(由可以相互独立交换的组件构建)。

    模块应该通过共享接口进行交互,这些接口定义在模块的外部,即在框架中或在本身“不是”模块的程序集中。根据您的要求,您应该预先定义(并在构建过程中强制执行)存在哪些模块,哪些接口组件以及允许哪个模块引用哪个接口组件。

    那么如何在应用程序加载时显示帮助视图?在加载初始视图(无论是什么)时发送消息(例如通过IEventAggregator 或任何其他通信机制)。帮助模块侦听消息并导航到帮助视图。重要提示:SessionResume 模块也可能会监听我们的消息。选择要部署哪些模块的人有责任只部署相互兼容的模块。

    【讨论】:

    • 感谢您的解释。我最终创建了一个从PubSubEvent 派生的AppNavigationEvent。解决方案的任何部分都可以使用有效负载发布此事件以指示所需的视图,并且任何知道如何加载特定视图的模块都会这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多