【问题标题】:Displaying a default view from Prism OnDemand module从 Prism OnDemand 模块显示默认视图
【发布时间】:2020-08-19 10:59:18
【问题描述】:

我正在使用 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 设计理念。有什么想法吗?

【问题讨论】:

    标签: c# wpf prism


    【解决方案1】:

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

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

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

    【讨论】:

    • 太好了,谢谢 - 我应该想到这种方法。你能想出一个策略让我在加载程序集之前附加可以访问的模块信息吗?
    • 如果不先加载程序集,就无法真正访问程序集中的任何内容,对吗?但是您可以在模块旁边放置一些文件,其中包含您的元数据(如MyModule.dllMyModule.meta),您可以加载并检查这些文件,然后决定是否加载该模块。
    猜你喜欢
    • 1970-01-01
    • 2021-03-12
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多