从Prism OnDemand模块显示默认视图

问题描述

我正在使用Prism中的DirectoryModuleCatalog为wpf加载一组模块。我想加载一个模块,并在我的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设计理念。有什么想法吗?

解决方法

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

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

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