2012-03-02 7 views
0

私はSilverlightでプリズムを使用していて、MefBootstrapperで自分のコードをベースにしています。次のように定義は次のとおりです。ブートストラップでモジュールのサービスを使用するCreateShell

public class MyBootstrapper : MefBootstrapper 
{ 
    protected override DependencyObject CreateShell() 
    { 
     return this.Container.GetExportedValue<MainPage>(); 
    } 

    protected override void InitializeShell() 
    { 
     base.InitializeShell(); 

     App.Current.RootVisual = (UIElement)this.Shell; 
    } 

    protected override Microsoft.Practices.Prism.Modularity.IModuleCatalog CreateModuleCatalog() 
    { 
     return Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(new Uri("/My;component/ModulesCatalog.xaml", UriKind.Relative)); 
    } 

    protected override void ConfigureAggregateCatalog() 
    { 
     base.ConfigureAggregateCatalog(); 

     // Add this assembly 
     this.AggregateCatalog.Catalogs.Add(new DeploymentCatalog()); 
    } 
} 

メインページは、私はすぐにそれを必要とするようModulesCatalog.xamlで、InitializationMode="WhenAvailable"に設定されていることを別のXAPに住んでいるそのImportingConstructorで成分を有しています。

私はブレークポイントでチェックし、CreateShell()メソッドの前にCreateModuleCatalog()メソッドが呼び出されていますので、インポートしたモジュールを使用できると思います。しかし、私は、CreateShell()の前に私のモジュールのInitialize()が呼び出されていないことに気付きました。この仕事をするために私は何ができますか?

答えて

1

モジュールInitialize()は、まだロードされていないため、CreateShell()より前に呼び出されません。 IModuleManager.LoadModuleCompletedイベントを使用して、モジュールがロードされた時刻を確認できます。

EDIT:

は、メインページのコンストラクタに他のモジュールからのあなたのサービスをインポートしないでください。

moduleManager.LoadModuleCompleted += ModuleManagerLoadModuleCompleted; 
... 
private void ModuleManagerLoadModuleCompleted(object sender, LoadModuleCompletedEventArgs e) 
{ 
    if(e.ModuleInfo.ModuleName == "YourModuleName") 
    { 
     var service = ServiceLocator.Current.GetInstance<IService>(); 
     ... 
     moduleManager.LoadModuleCompleted -= ModuleManagerLoadModuleCompleted; 
    } 
} 
+0

だから私は自分のシェルを構築する前にそれを待つつもりですか? CreateShellメソッドは同期メソッドであり、すぐに戻り値を期待しています... – Alex

関連する問題