2011-02-08 19 views
2

私はメニューのmsリボンコントロールを使用するWPFウィンドウアプリケーションを持っています。インフラストラクチャプロジェクトでは、すべてのモジュールで参照される共有サービスが必要です。各モジュールはそのサービスを使用して、モジュールに表示されるメニュー項目を定義します。Prism v4、MEFサービス

私はこのPrism+MEF: delayed a service export from prism-moduleを読んでいますが、他のモジュールにサービスを認識させることはできません。

サービス

namespace Infrastructure 
{ 
    [ModuleExport("InfModule", typeof(InfModule), InitializationMode = InitializationMode.WhenAvailable)] 
    [PartCreationPolicy(CreationPolicy.Shared)] 
    public class InfModule : IModule 
    { 
     [Export(typeof(IMenuService))] 
     public IMenuService MenuService { get; private set; } 

     public void Initialize() 
     { 
      MenuService = new MenuService(); 

      MenuService.AddItem("test"); 
     } 
    } 
} 

モジュール

namespace Classic 
{ 
    [ModuleExport("Classic", typeof(Classic), InitializationMode = InitializationMode.WhenAvailable)] 
    [ModuleDependency("InfModule")] 
    public class Classic : IModule 
    { 
     private IRegionManager _regionManager; 

     [Import(typeof(IMenuService))] 
     private IMenuService menuService { get; set; } 

     [ImportingConstructor] 
     public Classic(IRegionManager regionManager) 
     { 
      this._regionManager = regionManager; 

      // This shows as true 
      Debug.WriteLine(menuService == null); 
     } 

     public void Initialize() 
     { 
      _regionManager.RegisterViewWithRegion("RibbonRegion", typeof(Views.RibbonTabMenu)); 

      // This shows as true 
      Debug.WriteLine(menuService == null); 
     } 
    } 
} 

そのインポートので、私は偽として出力するデバッグ線の一方を期待しているだろう。どんなアイデアでも私は行方不明ですか?

答えて

2

オブジェクトが構築されるまでプロパティを設定することができないため、コンストラクタの実行中にプロパティのインポートが設定されることはありません。

もう1つの問題は、InfModuleで、エクスポートされた値を遅く設定していることです。 MEFは、エクスポートの値を1回だけ調べてから、その値をキャッシュし、ゲッターを再度呼び出さない。この場合、Initialize()が呼び出される前にエクスポートが取得されています。エクスポートを設定するロジックは、コンストラクタまたはプロパティゲッターのコードから実行する必要があります。

+0

ありがとう、それはそれを解決しました。私はgetterでMenuServiceを初期化し、IMenuServiceを引数としてモジュールのImportingConstructorに追加しました。私はModuleDependencyの行をコメントアウトし、それはまだ動作します...本当に理由は分かりません。 –

+1

@Chris Klepis:これは、モジュールの初期化の順序が、あなたが望むところで起こるためです。 ModuleDependencyを追加することで、注文はあなたが望む場所に落ちることが保証されます。本当に依存関係がある場合は、その依存関係を後で追加して、後で問題が発生しないようにする必要があります。 –

関連する問題