私はメニューの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);
}
}
}
そのインポートので、私は偽として出力するデバッグ線の一方を期待しているだろう。どんなアイデアでも私は行方不明ですか?
ありがとう、それはそれを解決しました。私はgetterでMenuServiceを初期化し、IMenuServiceを引数としてモジュールのImportingConstructorに追加しました。私はModuleDependencyの行をコメントアウトし、それはまだ動作します...本当に理由は分かりません。 –
@Chris Klepis:これは、モジュールの初期化の順序が、あなたが望むところで起こるためです。 ModuleDependencyを追加することで、注文はあなたが望む場所に落ちることが保証されます。本当に依存関係がある場合は、その依存関係を後で追加して、後で問題が発生しないようにする必要があります。 –