[Module(ModuleName = "ModuleA", OnDemand = true)]
public class ModuleAModule : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
var regionManager = containerProvider.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA));
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
}
}
ModuleAttribute 类定义了一个名为 OnDemand 的属性。这个属性用于指示模块是否应该按需加载(on-demand loading)。让我们详细解释一下它的含义和作用:
OnDemand 属性的含义
类型:bool
默认值:false
功能:决定模块是自动加载还是按需加载。
解释
当 OnDemand 设置为 false(默认值)时,表示该模块将在其所有依赖项满足后立即加载。这意味着一旦应用程序启动并且所有必需的模块都准备就绪,Prism 会自动加载此模块。
当 OnDemand 设置为 true 时,则表示该模块不会自动加载。相反,它需要通过显式调用 ModuleManager 来手动加载。这种方式适合那些不是立即需要的模块,或者只有在特定条件下才需要加载的模块。
使用场景示例
假设你有一个大型应用程序,包含多个模块,其中一些模块只在特定情况下使用(例如,用户点击某个菜单项或按钮时)。在这种情况下,你可以将这些模块标记为 OnDemand=true,以延迟加载它们,从而提高应用启动速度并节省资源。
示例代码
定义模块时设置 OnDemand
[Module(ModuleName = "FeatureXModule", OnDemand = true)]
public class FeatureXModule : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
// 初始化逻辑
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
// 注册服务等
}
}
在这个例子中,FeatureXModule 被标记为按需加载 (OnDemand=true),因此它不会在应用程序启动时自动加载
手动加载按需模块
为了手动加载按需模块,你需要使用 ModuleManager。以下是如何实现这一点的一个简单示例:
public class SomeViewModel
{
private readonly IModuleManager _moduleManager;
public SomeViewModel(IModuleManager moduleManager)
{
_moduleManager = moduleManager;
}
public void LoadFeatureX()
{
// 在需要时手动加载模块
_moduleManager.LoadModule("FeatureXModule");
}
}
在这个例子中,当 LoadFeatureX 方法被调用时(可能是响应用户的某个操作),FeatureXModule 模块会被显式加载。
按需加载 vs 自动加载
自动加载 (WhenAvailable):当所有依赖项都满足后,模块会在应用程序启动过程中自动加载。
按需加载 (OnDemand):模块不会自动加载,而是需要显式调用 ModuleManager.LoadModule(“ModuleName”) 来手动加载它。
注意事项:
在 Prism 中,当你使用 moduleCatalog.AddModule<ModuleA.ModuleAModule>(); 这种方式添加模块时,默认情况下这并不直接指定模块是按需加载还是自动加载。你需要通过设置模块的加载选项来明确这一点。
AddModule 方法的使用
Prism 提供了多个重载版本的 AddModule 方法,允许你更细致地控制模块的行为。以下是一个常见的用法示例:
moduleCatalog.AddModule(new ModuleInfo()
{
ModuleName = "ModuleAModule",
ModuleType = typeof(ModuleA.ModuleAModule).AssemblyQualifiedName,
InitializationMode = InitializationMode.WhenAvailable // 或者 InitializationMode.OnDemand
});
在这个例子中,InitializationMode 属性决定了模块是按需加载(OnDemand)还是自动加载(WhenAvailable)。如果你不指定这个属性,默认行为可能是根据框架或配置的不同而不同,但通常默认为自动加载(即 WhenAvailable)。
使用 AddModule 方法并指定加载模式
如果你想使用泛型方法 AddModule() 并同时指定加载模式,可以这样做:
// 假设你想让 ModuleAModule 成为按需加载
moduleCatalog.AddModule(new ModuleInfo(typeof(ModuleA.ModuleAModule))
{
ModuleName = "ModuleAModule",
InitializationMode = InitializationMode.OnDemand
});
或者,如果使用的是一个支持更多参数的重载版本,可以直接这样写:
//这种方式通常默认为自动加载
moduleCatalog.AddModule<ModuleA.ModuleAModule>();
//指定按需加载
moduleCatalog.AddModule<ModuleA.ModuleAModule>("ModuleAModule", InitializationMode.OnDemand);
总结
使用 moduleCatalog.AddModule<ModuleA.ModuleAModule>(); 本身并不会直接决定模块是按需加载还是自动加载。你需要明确地通过设置 InitializationMode 属性来定义模块的加载行为。
如果未指定 InitializationMode,则通常默认为自动加载(WhenAvailable),但这取决于具体实现和框架版本。
若要确保模块是按需加载,必须明确设置 InitializationMode 为 OnDemand。这样,在实际需要使用该模块的功能时,可以通过 ModuleManager 手动加载它。