显示来自 Prism OnDemand 模块的默认视图

Displaying a default view from Prism OnDemand module

我正在使用 Prism for wpf 中的 DirectoryModuleCatalog 加载一组模块。我想在我的 shell 应用程序中加载一个模块并在单击按钮时显示其默认视图(所有模块都标有 [Module(OnDemand = true)] 属性)。我在发现模块名称时缓存它们:

var modulesCatalog = new DirectoryModuleCatalog {ModulePath = @"C:\WhereTheModulesLive"};
modulesCatalog.Initialize();             

foreach (var module in modulesCatalog.Modules)
{
    _availableModules.Add(module.ModuleName);
}

这使我能够将我需要的模块的名称映射到一个按钮(下面是命令的结果,由单击按钮触发,其中按钮是从 _availableModules 填充的)。目前,我通过约定命名导航到默认视图:

private void LoadAndDisplayModule(string moduleName)
{
    _moduleManager.LoadModule(_availableModules.GetNameOfModuleToLoad());
    _moduleManager.Run();
    _regionManager.RequestNavigate(RegionNames.ContentRegion, moduleName + "View");
}

这感觉像是一个不整洁和脆弱的实现 - 还有一些我希望嵌入到模块中的更多信息 - 最好在加载之前访问。我想知道是否有办法做到这一点?我想知道如何向模块添加自定义属性,但我不知道在模块发现期间如何读取它(无需重写 DirectoryModuleCatalog)。或者,如果有一种方法可以使模块支持接口,它可以转换为 (MyModule : IModule, ISupportsDefaultView),但我认为直接访问 IModule 对象违背了 Prism 设计理念。有什么想法吗?

模块是short-lived,仅用于初始化。您应该创建一个注册表,每个模块在初始化时都可以在其中放置其额外信息(如默认视图):

public interface IModuleRegistry
{
    void RegisterDefaultView( string name );
    IReadOnlyCollection<string> GetDefaultViews();
}

然后,应用程序可能会在加载所有模块时(或每次新模块添加数据时)查看请求的默认视图列表并添加它们。当然,生产代码应该使用两个不同的接口,并且在不同的范围内,这很可能取决于您的体系结构要求。