【问题标题】:Prism: Loading Modules in to catalog after shell is createdPrism:创建外壳后将模块加载到目录中
【发布时间】:2011-03-01 04:27:52
【问题描述】:

在引导程序创建目录后,您可以使用 Unity 或 MEF 加载模块吗?换句话说,当应用程序启动并且引导程序 CreateModuleCatalog 代码已执行时,单击按钮加载一个未知的模块?无论是在文档中还是通过互联网搜索,我都没有找到一个很好的例子。要么它不支持这一点,要么我只是错过了一些东西。我发现的所有东西都只在引导程序中加载模块。

我正在尝试进行概念验证的基本 WPF 项目是:

  1. 加载应用程序。它将加载一些标准模块。外壳将被创建并可见。
  2. 用户交互将触发发现新模块的需求,将其添加到目录中,然后在 UI 上公开。我还不太关心它如何发现模块,更关心如何加载它们。发现很可能是查询数据库,下载所需的 .dll,然后保存到已知目录。

我觉得它相对简单,我一直在旋转我的轮子试图解决这个问题。

【问题讨论】:

    标签: wpf unity-container prism mef


    【解决方案1】:

    查看 Prism 4.0 快速入门 - Silverlight 的 MEF 模块化。

    本快速入门从 XAML 创建目录,但您可以手动将条目添加到模块目录并传递类似的参数。模块信息类唯一需要的是 XAP 文件的 REF。

    您还可以查看桌面版本。这个在目录中找到包含模块的 DLL,然后从磁盘加载它们。您可以通过指向某个文件位置的已知 DLL 来做同样的事情。

    本质上,如果您将正确的模块信息添加到 ModuleCatalog 中,则需要加载模块以及下载或加载的 DLL,MEF/Unity 容器将初始化该模块。

    【讨论】:

    • 我已经详细查看了这些示例,但它们似乎都在 bootstatper 中的应用程序启动期间加载了模块。实际上,我的意思是识别模块,而不一定要加载它们。我想在应用程序启动并执行引导程序代码后识别模块。换句话说,当使用模块目录时,我不知道模块是什么,我不知道以后如何或是否可以。
    【解决方案2】:

    我是 Prism 的新手,我也遇到过类似的问题。经过大量搜索,我找不到任何直接的帮助。但是,我以不同的方式解决了这个问题。下面是代码:

    1. 在视图模型类 (MasterViewModel) 中创建了一个 DelegateCommand 属性,并在事件处理程序代码上添加并加载了 Modulecatalog 中的新模块。

    2. 将其连接到视图的 xaml 上的按钮单击事件

      <Button Content="Button" Height="28" HorizontalAlignment="Left" Margin="8,0,0,0"
          Name="btnLoadModule2" VerticalAlignment="Top" Width="98" 
          prism:Click.Command="{Binding  DataContext.LoadModule2Command, ElementName=root}"/>
      
    3. 使用依赖注入获取ModuleCatalog & ModuleManager的引用

    4. 在点击事件代码中,我在 ModuleCatalog 中添加了一个 Module in code(即 Module2)并使用 Module manager 加载它。

      public MasterViewModel(IDataService dataService, IEventAggregator eventAggregator, IRegionManager regionManager
                              , IModuleCatalog moduleCatalog, IModuleManager moduleManager)
      {
          _dataService = dataService;
          _eventAggregator = eventAggregator;
          _regionManager = regionManager;
      
          // Get the data model from the data service.
          _model = dataService.GetModel();
      
          // Initialize the CollectionView for the underlying model.
          DataItemsCV = new ListCollectionView(_model);
          // Track the current selection.
          DataItemsCV.CurrentChanged += new EventHandler(SelectedItemChanged);
      
          // Initialize the commands.
          NavigateToViewCommand = new DelegateCommand<string>(NavigateToView);
          SyncViewCommand = new DelegateCommand<string>(SyncView);
      
          LoadModule2Command = new DelegateCommand<string>(LoadModule2);
          _moduleCatalog = moduleCatalog;
          _moduleManager = moduleManager;
      }
      
      void LoadModule2(string s)
      {      
          ModuleInfo module = new ModuleInfo()
                              { 
                                  Ref="Module2.dll", ModuleName="Module2", 
                                  ModuleType="Module2.ModuleInit, Module2, Version=1.0.0.0", 
                                  InitializationMode= InitializationMode.WhenAvailable , 
                               };
          module.DependsOn.Add("Module1");
      
          _moduleCatalog.AddModule(module);
          _moduleManager.LoadModule("Module2");
      
      }
      

    此技术可用于在初始 Shell 初始化后加载模块。我必须承认,杰夫的回答有点无关紧要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多