2011-03-01 5 views
4

부트 스트 래퍼가 카탈로그를 만든 후 Unity 또는 MEF를 사용하여 모듈을로드 할 수 있습니까? 즉, 버튼을 클릭하여 응용 프로그램이 시작되고 부트 스트 래퍼 CreateModuleCatalog 코드가 실행될 때 알 수없는 모듈을로드하십시오. 문서 또는 인터넷 검색을 통해이 좋은 예를 발견하지 못했습니다. 그것은 이것을 지원하지 않거나 나는 단지 뭔가를 놓치고 있습니다. 내가 찾은 모든 것은 bootstapper에서만 모듈을로드합니다. 내가 개념 증명을하려고 프리즘 : 쉘이 생성 된 후 모듈을 카탈로그에로드

기본 WPF 프로젝트

입니다 :

  1. 로드까지 응용 프로그램. 표준 모듈을로드합니다. 셸이 만들어져 표시됩니다.
  2. 사용자 상호 작용으로 인해 새 모듈을 찾고 카탈로그에 추가 한 다음 UI에 노출해야합니다. 나는 모듈을 어떻게 발견하는지에 대해서는별로 신경 쓰지 않는다. 검색은 대개 데이터베이스를 쿼리하고 필요한 .dll을 다운로드 한 다음 알려진 디렉터리에 저장하는 것입니다.

나는 그것이 비교적 간단하다는 느낌이 들었고 나는 이것을 알아 내려고 노력하고 있었다.

답변

3

Silverlight 용 Prism 4.0 빠른 시작 - 모듈 방식의 MEF를 살펴보십시오.

이 빠른 시작은 XAML에서 카탈로그를 만들지 만 항목을 모듈 카탈로그에 수동으로 추가하고 유사한 매개 변수를 전달할 수 있습니다. 모듈 정보 클래스에 필요한 유일한 것은 XAP 파일에 대한 REF입니다.

데스크톱 버전을 볼 수도 있습니다. 이 모듈은 디렉토리에 모듈을 포함하는 DLL을 찾은 다음 디스크에서로드합니다. 어떤 파일 위치에서 알려진 DLL을 가리켜 서 같은 일을 할 수 있습니다.

ModuleCatalog에 올바른 모듈 정보를 추가하면 다운로드하거나로드 할 DLL의 모듈로드를 요구하며 MEF/Unity 컨테이너는 해당 모듈을 초기화합니다.

+2

예제를 자세히 살펴 보았지만 응용 프로그램을 시작할 때 bootstatper에서 모듈을로드하는 것처럼 보입니다. 사실, 모듈을 식별하고 반드시로드하지 않아도됩니다. 응용 프로그램 시작 후 모듈을 식별하고 부트 스트래퍼 코드가 실행되고 싶습니다. 즉 모듈 카탈로그가 활용 될 때 모듈이 무엇인지 모릅니다. 나중에 어떻게 또는 어떻게 할 수 있는지 알 수 없습니다. – user638750

1

저는 프리즘을 처음 사용하고있어서 비슷한 문제가 있습니다. 많이 검색 한 후에 직접적인 도움을 찾을 수 없었습니다. 그러나 나는이 문제를 다른 방식으로 해결했다. 여기에 아래의 코드입니다 :

  1. 뷰 모델 클래스 (MasterViewModel)와 이벤트 핸들러 코드 추가에 DelegateCommand 속성을 만든이와 Modulecatalog에서 새 모듈을로드합니다.

  2. <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. 가 나는 추가 클릭 이벤트 코드에 ModuleManager

  4. ModuleCatalog &의 참조를 얻기 위해 의존성 주입을 사용보기의 XAML에 버튼의 클릭 이벤트에에 푹 Module in code (즉 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"); 
    
    } 
    

이 기술은 초기 셸 초기화 이후 모듈을 로딩 할 수있다. 제프의 ​​대답은 약간 부적절하다고 고백해야합니다.

관련 문제