首页 > 解决方案 > 当 app.config 中的其他模块设置为 Startup 时自动加载 OnDemand prism 模块

问题描述

我们将 Prism 7 与统一用于 WPF 应用程序。有一组 prism 模块依赖于其他模块。我希望能够通过 app.config 进行所有配置,以避免在打开和关闭功能时重新编译。所以,假设我们有以下三个模块:

<configSections>
<section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf" />
</configSections>

<appSettings>
....
</appSettings>

<modules>

<!--SOME KIND OF CONNECTION MODULE-->
<module
  moduleName="IConnectionsModule"
  assemblyFile="Connections.Module.dll"
  moduleType="Connections.Module.ConnectionsModule, Connections.Module"
  startupLoaded="true" 
/>

<!--SOME KIND OF MIDDLE MODULE-->
<module 
  moduleName="IMiddlewareModule"
  assemblyFile="Middleware.Module.dll"
  moduleType="Middleware.Module.MiddlewareModule, Middleware.Module"
  startupLoaded="false"
  >
  <dependencies>
    <dependency moduleName="IConnectionsModule"/>
  </dependencies>
</module>

<!--SOME KIND OF TOP-LEVEL MODULE-->
<module 
  moduleName="IToplevelModule"
  assemblyFile="Toplevel.Module.dll"
  moduleType="Toplevel.Module.ToplevelModule, Toplevel.Module"
  startupLoaded="true"
  >
  <dependencies>
    <dependency moduleName="IMiddlewareModule"/>
  </dependencies>
</module>

</modules>

Connection 模块将始终被加载。Middle 依赖于 Connection 模块并且设置为 hasstartupLoaded="false"所以它的 Initialization Mode 将被设置为OnDemand。Top Level 模块依赖于 Middle 模块并设置为,startupLoaded="true"因此其初始化模式为WhenAvailable. 这种解释可以在ConfigurationModuleCatalog.desktop.cs

ModuleInfo moduleInfo = new ModuleInfo(element.ModuleName, element.ModuleType)
{
    Ref = GetFileAbsoluteUri(element.AssemblyFile),
    InitializationMode = element.StartupLoaded ? InitializationMode.WhenAvailable : InitializationMode.OnDemand
};

https://github.com/PrismLibrary/Prism/blob/master/Source/Wpf/Prism.Wpf/Modularity/ConfigurationModuleCatalog.Desktop.cs#L73

我的期望是,即使启动时未加载 Middle 模块,Prism 也会识别出需要,因为 Toplevel 模块已加载,因此会自动启动它。但相反,它会引发错误:

    Module IToplevelModule is marked for automatic initialization when the application starts, but it depends on modules that are marked as OnDemand initialization. To fix this error, mark the dependency modules for InitializationMode=WhenAvailable, or remove this validation by extending the ModuleCatalog class.

所以,我的问题是:这可以做到吗?显然,简单的解决方法是将两者都设置为真或都设置为假。但我希望通过一些智能来避免一点操作员错误。我正在阅读文档,它提到了一个模块组,但我没有看到如何在配置文件中创建它。

最坏的情况,我想我可以扩展课程,但希望有办法避免这种情况。

标签: wpfmoduleprismapp-config

解决方案


推荐阅读