在app.config中将其他模块设置为“启动”时,自动加载按需棱镜模块

时间:2019-06-14 18:20:25

标签: wpf module prism app-config

我们正在将Prism 7与WPF应用程序统一使用。有一组棱镜模块依赖于其他模块。我希望能够通过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>

将始终加载连接模块。 Middle依赖于Connection模块,并且设置为startupLoaded="false",因此其初始化模式将设置为OnDemand。顶层模块取决于中间模块,并且设置为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

我的期望是,即使在启动时未加载中间模块,Prism也将意识到需求,因为顶级模块已启动,因此会自动启动它。但是相反,它引发了一个错误:

    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.

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

最坏的情况是,我想我可以扩展该类,但希望有一种避免这种情况的方法。

0 个答案:

没有答案