Prism: загрузка модулей в каталог после создания оболочки - PullRequest
4 голосов
/ 01 марта 2011

Используя Unity или MEF, можете ли вы загрузить модули после того, как загрузчик создаст каталог? Другими словами, нужно ли нажать кнопку, чтобы загрузить модуль, который не был известен, когда приложение запускалось и код загрузчика CreateModuleCatalog был выполнен? Я не нашел хорошего примера этого ни в документации, ни через интернет-поиски. Либо это не поддерживает, либо я просто что-то упускаю. Все, что я нахожу, загружает модули только в загрузчике.

Основной проект WPF, который я пытаюсь сделать для проверки концепции:

  1. Загрузите приложение. Это загрузит некоторые стандартные модули. Оболочка будет создана и видима.
  2. Взаимодействие с пользователем приведет к необходимости обнаружить новый модуль, добавить его в каталог и затем представить его в пользовательском интерфейсе. Я не так обеспокоен тем, как он обнаруживает модули, а тем более о том, как их загружать. Скорее всего, обнаружение будет состоять из запросов к базе данных, загрузки необходимых DLL-файлов и последующего сохранения в известном каталоге.

У меня такое ощущение, что это относительно просто, и я просто крутил колеса, пытаясь понять это.

Ответы [ 2 ]

3 голосов
/ 14 марта 2011

Взгляните на быстрый запуск Prism 4.0 - модульность с MEF для Silverlight.

Этот быстрый запуск создает каталог из XAML, но вы можете вручную добавить записи в каталог модулей и передать аналогичные параметры. Единственное, что нужно классу информации модуля - это ссылка на файл XAP.

Вы также можете посмотреть на настольную версию. Этот находит библиотеки DLL, содержащие модули в каталоге, а затем загружает их с диска. Вы можете сделать то же самое, указав на известную DLL в каком-то месте файла.

По сути, если вы добавите правильную информацию о модуле в ModuleCatalog, то потребует загрузки модуля, в который будет загружена или загружена DLL, и контейнеры MEF / Unity будут инициализированы этим модулем.

1 голос
/ 27 августа 2012

Я новичок в Prism, и у меня была похожая проблема.После долгих поисков я не смог найти никакой прямой помощи.Однако я решил проблему по-другому.Ниже приведен код:

  1. Создано свойство DelegateCommand в классе viewmodel (MasterViewModel), а в коде обработчика событий добавлен и загружен новый модуль в 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. По коду события щелчка я добавил модуль в коде (т. Е. Module2) в 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");
    
    }
    

ЭтоТехника может быть использована для загрузки модулей после начальной инициализации оболочки.Я должен признаться, что ответ Джеффа был немного неактуальным.

...