Мы используем 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>
Модуль подключения всегда будет загружен. Среднее зависит от модуля подключения и имеет значение 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 распознает необходимость, поскольку модуль 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.
Итак, мой вопрос таков: это можно сделать? Очевидно, что простое решение состоит в том, чтобы установить оба в true или оба в false. Но я надеялся избежать небольшой ошибки оператора с некоторым интеллектом. Я читал документы, и там упоминается группа модулей, но я не вижу, как создать это в файле конфигурации.
В худшем случае, я полагаю, я мог бы расширить класс, но надеясь найти способ избежать этого.