インターフェイスを実装するイベント ハンドラー クラスを含むオーチャード CMS 用のモジュールを作成していIOrchardShellEvents
ます。
Core レシピを使用して Orchard のストック実装をセットアップし、モジュールを有効にすると、アクティブな実装は 3 つだけですIOrchardShellEvents
。デフォルトでは、次の順序で呼び出されます。
- カスタム イベント ハンドラ (カスタム モジュール内)
AliasHolderUpdater
(Orchard.Alias
モジュールから)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 自体を変更する必要がありますか?