2011-03-01 67 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"); 
    
    } 
    

這種技術可以使用的初始殼牌初始化之後加載模塊。我必須承認,傑夫的答案略微不相關。