2011-03-01 70 views
4

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

基本WPF项目我试图做一个概念证明是:

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

我有一种感觉,它是相对简单的,我刚刚旋转我的车轮试图弄清楚。

回答

3

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

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

你也可以看看桌面版本。这一个发现DLL包含在目录中的模块,然后从磁盘加载它们。您可以通过在某个文件位置指向已知的DLL来做同样的事情。从本质上讲,如果您将正确的模块信息添加到ModuleCatalog中,那么要求加载下载或加载的DLL的模块,并且MEF/Unity容器将初始化该模块。

+2

我已经详细了解了这些示例,但它们似乎都是在bootstatper中的应用程序启动期间加载模块的。其实,我的意思是说识别这些模块,不一定会加载它们。我希望在应用程序启动并且bootstraper代码已执行后识别模块。换句话说,当模块目录被使用时,我不知道模块是什么,我不知道以后如何或者如何。 – user638750 2011-03-18 03:23:05

1

我是新来的棱镜,我也有类似的问题。经过多次搜索,我找不到任何直接帮助。不过,我用另一种方式解决了这个问题。这是下面的代码:创建一个DelegateCommand属性在视图模型类(MasterViewModel)和事件处理代码添加

  1. 并加载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. 在我添加了一个点击事件代码将代码中的模块(即模块2)添加到ModuleCatalog中,并使用模块管理器加载它。

    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"); 
    
    } 
    

这种技术可以使用的初始壳牌初始化之后加载模块。我必须承认,杰夫的答案略微不相关。

相关问题