{"record":{"id":"ea4bc7526eb313ea","repo":"PrismLibrary/Prism","slug":"resources-startupmoduledependsonanondemandmodule-formatted","errorCode":null,"errorMessage":"Resources.StartupModuleDependsOnAnOnDemandModule (formatted with moduleInfo.ModuleName)","messagePattern":"Resources\\.StartupModuleDependsOnAnOnDemandModule \\(formatted with moduleInfo\\.ModuleName\\)","errorType":"exception","errorClass":"ModularityException","httpStatus":null,"severity":"error","filePath":"src/Prism.Core/Modularity/ModuleCatalogBase.cs","lineNumber":328,"sourceCode":"                ValidateDependencies(GrouplessModules.Union(group));\n            }\n        }\n\n        /// <summary>\n        /// Ensures that there are no modules marked to be loaded <see cref=\"InitializationMode.WhenAvailable\"/>\n        /// depending on modules loaded <see cref=\"InitializationMode.OnDemand\"/>\n        /// </summary>\n        protected virtual void ValidateDependenciesInitializationMode()\n        {\n            var moduleInfo = Modules.FirstOrDefault(\n                m =>\n                m.InitializationMode == InitializationMode.WhenAvailable &&\n                GetDependentModulesInner(m)\n                    .Any(dependency => dependency.InitializationMode == InitializationMode.OnDemand));\n\n            if (moduleInfo != null)\n            {\n                throw new ModularityException(\n                    moduleInfo.ModuleName,\n                    string.Format(CultureInfo.CurrentCulture, Resources.StartupModuleDependsOnAnOnDemandModule, moduleInfo.ModuleName));\n            }\n        }\n\n        /// <summary>\n        /// Returns the <see cref=\"IModuleInfo\"/> on which the received module depends on.\n        /// </summary>\n        /// <param name=\"moduleInfo\">Module whose dependant modules are requested.</param>\n        /// <returns>Collection of <see cref=\"IModuleInfo\"/> dependants of <paramref name=\"moduleInfo\"/>.</returns>\n        protected virtual IEnumerable<IModuleInfo> GetDependentModulesInner(IModuleInfo moduleInfo)\n        {\n            return Modules.Where(dependantModule => moduleInfo.DependsOn.Contains(dependantModule.ModuleName));\n        }\n\n        /// <summary>\n        /// Ensures that the catalog is validated.\n        /// </summary>","sourceCodeStart":310,"sourceCodeEnd":346,"githubUrl":"https://github.com/PrismLibrary/Prism/blob/358118cd640d9a22ff8cf21c8ad197fa038b7990/src/Prism.Core/Modularity/ModuleCatalogBase.cs#L310-L346","documentation":"ValidateDependenciesInitializationMode throws ModularityException with Resources.StartupModuleDependsOnAnOnDemandModule when a module set to load WhenAvailable (at startup) depends on a module set to OnDemand. The dependency could not be initialized when the startup module needs it, so Prism rejects the configuration up front.","triggerScenarios":"Module A has InitializationMode.WhenAvailable and its DependsOn chain includes a module with InitializationMode.OnDemand; detected during catalog Validate().","commonSituations":"Changing a dependency to OnDemand to speed startup without checking which startup modules depend on it; conflicting InitializationMode values set in config by different teams.","solutions":["Change the OnDemand dependency module to WhenAvailable so it initializes before its dependents.","Alternatively change the dependent startup module to OnDemand so it loads later with its dependency.","Remove the dependency if it is not actually required."],"exampleFix":"// before\nnew ModuleInfo { ModuleName = \"Core\", InitializationMode = InitializationMode.OnDemand },\nnew ModuleInfo { ModuleName = \"Shell\", DependsOn = new[] { \"Core\" }, InitializationMode = InitializationMode.WhenAvailable }\n// after\nnew ModuleInfo { ModuleName = \"Core\", InitializationMode = InitializationMode.WhenAvailable },\nnew ModuleInfo { ModuleName = \"Shell\", DependsOn = new[] { \"Core\" }, InitializationMode = InitializationMode.WhenAvailable }","handlingStrategy":"validation","validationCode":"foreach (var m in modules.Where(m => m.InitializationMode == InitializationMode.WhenAvailable))\n{\n    foreach (var dep in modules.Where(d => m.DependsOn?.Contains(d.ModuleName) == true))\n    {\n        if (dep.InitializationMode == InitializationMode.OnDemand)\n            throw new InvalidOperationException($\"{m.ModuleName} (WhenAvailable) depends on OnDemand module {dep.ModuleName}\");\n    }\n}","typeGuard":null,"tryCatchPattern":"try\n{\n    catalog.Validate();\n}\ncatch (ModularityException ex)\n{\n    logger.LogError(ex, \"Startup module depends on an OnDemand module: {0}\", ex.Message);\n    // align InitializationMode values before retrying\n}","preventionTips":["Keep transitive dependencies of startup modules on WhenAvailable","Review InitializationMode changes for downstream dependents","Encode the initialization-mode graph in a startup unit test"],"tags":["modularity","initialization-mode","dependency-validation","prism"],"backgroundTag":"invalid-state-transition","analyzedSha":"358118cd640d9a22ff8cf21c8ad197fa038b7990","analyzedAt":"2026-09-15T15:00:31.079Z","contentChangedAt":"2026-09-15T15:00:31.079Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}