2011-06-28 9 views
1

現在、私はMEFとPRISMを統合して相互作用させようとしています。これまでのところすべてがうまくいっています。今は、MEFランタイムモジュールディスカバリ(DeploymentCatalog)を使用して、サーバーディレクトリからXAPをダウンロードし、MAIN UI内のリージョンの1つに接続したいと考えています。CompositionHost.Initialize()は2回実行できません

私はUnityBootStrapperを使用しています。このクラスの内部では、MEFコンテナも統合されています。このサンプルアプリケーションはGlenn Block(http://codebetter.com/glennblock/2010/01/03/mef-and-prism-exploration-mef-module-loading/)に基づいています。

次のコードは、私のブートストラップの内側CompositionContainerを初期化するために使用されます。

 // This is the host catalog which contains all parts of running assembly. 
     var catalog = GetHostCatalog(); 

     // Create MEF container which initial catalog 
     var container = new CompositionContainer(catalog); 


     // here we explicitly map a part to make it available on imports elsewhere, using 
     // Unity to resolve the export so dependencies are resolved 
     // We do this because region manager is third-party ... therefore, we need to 
     // export explicitly because the implementation doesn't have its own [export] tag 
     container.ComposeExportedValue<IRegionManager>(Container.Resolve<IRegionManager>()); 
     container.ComposeExportedValue<IEventAggregator>(Container.Resolve<IEventAggregator>()); 

     // Obtain CatalogService as a singleton 
     // All dynamic modules will use this service to add its parts. 
     Container.RegisterInstance<ICatalogService>(new CatalogService(catalog)); 


     // Initialize the container 
     CompositionHost.Initialize(container); 

今私は、サーバーからXAPをダウンロードするために使用されるDeploymentCatalogServiceと呼ばれる別のクラスを持っています。私が直面している現在の問題は、DeploymentCatalogService Initializeメソッドの中で、CompositionHostコンテナがaggregateCatalogでコンテナを再度初期化しようとしていることです。

_aggregateCatalog = new AggregateCatalog(); 
     _aggregateCatalog.Catalogs.Add(new DeploymentCatalog()); 
     CompositionHost.Initialize(_aggregateCatalog); 

これにより、コンテナが既に初期化されているとの例外が発生します。既存のコンテナを使用し、それを新しいaggregateCatalogで更新する方法はありますか?

これはあまり混乱しないと思います。私はまだMEFに新しいです。

乾杯、

答えて

0

コンテナを1回しか初期化できません。あなたの場合は、AggregateCatalogでコンテナを作成し、そのカタログへの参照を保存する必要があります。その後、そのAggregateCatalogにDeploymentCatalogを追加することができます。

+0

アイデアを使用して、私はCompositionContainerとAggregateCatalogをラップする静的なCompositionHelperクラスを作成しました。呼び出し側は、CompositionHelper経由でCompositionContainerとやりとりすることができます。これを行うことで、私はコンテナを初期化する方法と、同じAggegrateCatalogを使って新しいカタログを追加する方法を制御する中心的な場所を持っています。 – Khoa

関連する問題