0

IModuleManager を使用してオンデマンドで Unity PRISM モジュールを実装しています。モジュールの機能が必要なポイントが複数あるとします。moduleManager.LoadModule("MyModule")モジュールが既にロードされている可能性がある場合でも、これらの各ポイントで呼び出すのは正しいですか? リロードしませんよね?

そして、これはベストプラクティスですか?

ありがとう

4

2 に答える 2

1

Prism Modularity クイックスタートを見ると

モジュールのロードを担当するこのメソッドが見つかります

    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

私はそれを取り除こうとしましたが、次のことを発見しました:

  1. moduleManager.LoadModule("YourModule");複数回呼び出しても例外はスローされません。

  2. モジュールのInitializeメソッドは、モジュールを初めてロードしたときにのみ呼び出されます。

モジュールのロードとは、モジュール アセンブリがディスクからメモリに転送されることを意味します。だから... 毎回リロードされるなら 本当にそうすべきではありません。「これはベストプラクティスですか?」という質問に答えるだけです。私は言わなければなりません...それは間違いなくそうではありません。呼び出すたびにリロードされるかどうかはmoduleManager.LoadModule("YourModule");わかりませんが、IMHOモジュールも1回だけロードするため、モジュールを1回だけロードする必要があります。

于 2013-01-14T12:06:15.190 に答える
-2

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
            }
        }

(...)
于 2013-01-18T05:02:23.480 に答える