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