WPF Prism Module按需加载和自动加载

发布于:2025-03-16 ⋅ 阅读:(21) ⋅ 点赞:(0)
 [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 手动加载它。