5

インターフェイスを実装するイベント ハンドラー クラスを含むオーチャード CMS 用のモジュールを作成していIOrchardShellEventsます。

Core レシピを使用して Orchard のストック実装をセットアップし、モジュールを有効にすると、アクティブな実装は 3 つだけですIOrchardShellEvents。デフォルトでは、次の順序で呼び出されます。

  1. カスタム イベント ハンドラ (カスタム モジュール内)
  2. AliasHolderUpdater(Orchard.Aliasモジュールから)
  3. AutomaticDataMigrations(からOrchard.Framework)。

該当するイベントが発生したときに、クラスが より遅く呼び出されるようにこれらを設定したいと思いAutomaticDataMigrationsます。モジュールのDependenciesフィールドとPriorityフィールドの両方を試してみましたModules.txtが、クラスを より遅く実行することはできませんAutomaticDataMigrations

私が試したこと:

  • Dependencies: Orchard.Frameworkをモジュールの に追加しようとしModule.txtました。これは何もしないようです。ただし、Dependencies: Orchard.Aliasをに追加するModule.txtと、実際に私のクラスは より後に呼び出されAliasHolderUpdaterます。AutomaticDataMigrationsの一部であるでは機能しませんOrchard.Framework

  • Priority: 1をモジュールの に追加しようとしModule.txtました。これにより、クラスがIOrchardShellEventsモジュールに存在する他の実装よりも遅く呼び出されますAliasHolderUpdater。ただし、それでもAutomaticDataMigrations最後に呼び出します。

メソッドを見るExtensionManager.AvailableFeaturesと、すべての機能が依存関係と優先度の順に読み込まれていることがわかります。これは、IDependency各モジュールの実際のオブジェクトがこの順序で AutoFac に登録されることを意味します。

DependencyOrdering.OrderByDependenciesAndPriorities(詳細は、、、CompositionStrategy.ComposeおよびShellContainerFactory.CreateContainerメソッドで確認できます)

Orchard.Frameworkモジュールに存在するクラスの登録順序を、「オーチャード モジュール」ではなく、モジュール ロードの通常の規則に従わない に存在するクラスと比較して制御する方法がわかりません。

の目的はAutomaticDataMigrations、最新のデータベース移行が実行されたことを確認することであるため、イベント ハンドラーが実行されたときに、セットアップされたデータベース テーブルを確実に利用できるように、クラスを後で呼び出す必要があります。移行によって。

より後に実行するようにクラスを登録するにはどうすればよいAutomaticDataMigrationsですか? それとも、Orchard 自体を変更する必要がありますか?

4

1 に答える 1