gpt4 book ai didi

c# - 在 Orchard CMS 中,是否可以在模块中注册 IEventHandler 实现,以便比驻留在 Orchard.Framework 中的模块更晚调用?

转载 作者:太空狗 更新时间:2023-10-29 23:46:11 30 4
gpt4 key购买 nike

我正在为 Orchard CMS 编写一个模块,其中包含一个实现 IOrchardShellEvents 接口(interface)的事件处理程序类。

当使用核心配方设置 Orchard 的常用实现并启用我的模块时,IOrchardShellEvents 只有三个事件实现。默认情况下,它们按以下顺序调用:

  1. 我的自定义事件处理程序(在我的自定义模块中)
  2. AliasHolderUpdater(来自 Orchard.Alias 模块)
  3. AutomaticDataMigrations(来自 Orchard.Framework)。

我想设置这些,以便在触发适用的事件时,我的类被调用晚于 AutomaticDataMigrations。我试过在我的模块的 Modules.txt 中同时使用 DependenciesPriority 字段,但我无法让我的类运行晚于 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.OrderByDependenciesAndPrioritiesCompositionStrategy.ComposeShellContainerFactory.CreateContainer方法)

我没有找到一种方法来控制驻留在模块中的类相对于驻留在 Orchard.Framework 中的类的注册顺序,这不是“Orchard 模块”并且不遵循模块加载的正常规则。

因为 AutomaticDataMigrations 的目的是确保运行最新的数据库迁移,我希望我的类在它之后被调用,这样当我的事件处理程序运行时我可以确保它可以使用迁移设置的数据库表。

如何注册我的类以晚于 AutomaticDataMigrations 运行?或者,这是否需要修改 Orchard 本身?

最佳答案

我想我已经找到了这个问题的答案,我相信它实际上是 Orchard 中的一个错误。

Orchard.Environment.ShellBuilders.CompositionStrategy 包含以下代码:

    var enabledFeatures = _extensionManager.EnabledFeatures(descriptor);
var features = _extensionManager.LoadFeatures(enabledFeatures);

if (descriptor.Features.Any(feature => feature.Name == "Orchard.Framework"))
features = features.Concat(BuiltinFeatures());

功能描述符以“依赖”顺序从 EnabledFeatures() 返回——列表中较早的项目不应依赖于列表中较晚的项目。在最终构建依赖容器时使用此顺序。

因为 Orchard.Framework 不应该依赖于任何东西,而一切都可以依赖于 Orchard.Framework,所以这个应该放在第一位......代码应该是这样的(这里只修改了最后一行):

    var enabledFeatures = _extensionManager.EnabledFeatures(descriptor);
var features = _extensionManager.LoadFeatures(enabledFeatures);

if (descriptor.Features.Any(feature => feature.Name == "Orchard.Framework"))
features = BuiltinFeatures().Concat(features);

这样,当依赖项作为列表的一部分(例如事件处理程序)注入(inject)时,内置功能应该首先出现,因为它们没有依赖项。

这解决了我的问题,因为我可以依靠 Orchard.Framework 提供的 IOrcharShellEvents 实现在自定义模块提供的任何实现之前被调用。

我已在 Orchard 问题跟踪器中将以上内容作为建议修复提交:http://orchard.codeplex.com/workitem/20286

关于c# - 在 Orchard CMS 中,是否可以在模块中注册 IEventHandler 实现,以便比驻留在 Orchard.Framework 中的模块更晚调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19787263/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com