2011-02-08 65 views
2

我有一個WPF窗口應用程序,它使用ms功能區控件作爲菜單。在我的基礎結構項目中,我希望有一個共享服務,它將在所有模塊中引用。然後,每個模塊將使用該服務來定義應該爲模塊顯示哪些菜單項。棱鏡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

運行構造函數時不會設置屬性導入,因爲在構造對象之前無法設置對象的屬性。

另一個問題是,在InfModule中,您設置的導出值太晚。 MEF只會查看一次導出的值,然後緩存該值並且不會再次調用getter。在這種情況下,它會在調用Initialize()之前獲取導出。設置導出的邏輯需要從構造函數或屬性getter中的代碼運行。

+0

謝謝,解決了它。我在getter中初始化MenuService,並將IMenuService作爲參數添加到模塊中的ImportingConstructor。我評論了ModuleDependency系列,它仍然有效......不知道爲什麼。 – 2011-02-08 16:35:12