IModuleManager を使用してオンデマンドで Unity PRISM モジュールを実装しています。モジュールの機能が必要なポイントが複数あるとします。moduleManager.LoadModule("MyModule")
モジュールが既にロードされている可能性がある場合でも、これらの各ポイントで呼び出すのは正しいですか? リロードしませんよね?
そして、これはベストプラクティスですか?
ありがとう
モジュールのロードを担当するこのメソッドが見つかります
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonUp(e);
if (!e.Handled)
{
if ((this.moduleTrackingState != null) && (this.moduleTrackingState.ExpectedInitializationMode == InitializationMode.OnDemand) && (this.moduleTrackingState.ModuleInitializationStatus == ModuleInitializationStatus.NotStarted))
{
this.RaiseRequestModuleLoad();
e.Handled = true;
}
}
}
this.RaiseRequestModuleLoad();
でない場合ModuleInitializationStatus
はへの呼び出しができない条件があることに注意してくださいModuleInitializationStatus.NotStarted
。
私はそれを取り除こうとしましたが、次のことを発見しました:
moduleManager.LoadModule("YourModule");
複数回呼び出しても例外はスローされません。
モジュールのInitialize
メソッドは、モジュールを初めてロードしたときにのみ呼び出されます。
モジュールのロードとは、モジュール アセンブリがディスクからメモリに転送されることを意味します。だから... 毎回リロードされるなら 本当にそうすべきではありません。「これはベストプラクティスですか?」という質問に答えるだけです。私は言わなければなりません...それは間違いなくそうではありません。呼び出すたびにリロードされるかどうかはmoduleManager.LoadModule("YourModule");
わかりませんが、IMHOモジュールも1回だけロードするため、モジュールを1回だけロードする必要があります。
Viktor に同意して、このスレッドの応答は、 LoadModule を呼び出すのではなく、IModuleCatalog と IModuleManager を使用して ModuleState をチェックすることを提案しています。
その投稿のコードスニペットは次のとおりです。
(...)
var module = this.moduleCatalog.Modules.FirstOrDefault(m => m.ModuleName == "MyModule");
if (module != null)
{
if (module.State != ModuleState.Initialized)
{
moduleManager.LoadModuleCompleted += moduleManager_LoadModuleCompleted;
moduleManager.LoadModule("MyModule");
}
else
{
//Initialization logic
}
}
}
void moduleManager_LoadModuleCompleted(object sender, LoadModuleCompletedEventArgs e)
{
moduleManager.LoadModuleCompleted -= moduleManager_LoadModuleCompleted;
if (e.ModuleInfo.ModuleName == "MyModule")
{
//Initialization logic
}
}
(...)