Kat*_*uro 5 c# autofac orchardcms
我正在为Orchard CMS编写一个模块,其中包含一个实现IOrchardShellEvents接口的事件处理程序类.
当使用Core配方设置Orchard的库存实现时,我启用了我的模块,只有三个活动实现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,而不是"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());
Run Code Online (Sandbox Code Playgroud)
功能描述符按“依赖”顺序返回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);
Run Code Online (Sandbox Code Playgroud)
这样,当依赖项作为列表的一部分(例如事件处理程序)注入时,内置功能应该首先出现,因为它们没有依赖项。
这解决了我的问题,因为我可以依赖Orchard.Framework-providedIOrcharShellEvents自定义模块提供的任何实现之前调用
我已将上述内容作为建议修复提交到 Orchard 问题跟踪器中:http://orchard.codeplex.com/workitem/20286