Orchard CMS - 如何指定内容处理程序的调用顺序?

时间:2016-09-07 07:46:29

标签: call orchardcms autofac handlers

Autofac解析的内容处理程序以不可预测的顺序返回。我需要按特定顺序调用一些内容处理程序。

示例:

功能A

内容处理程序A - >从用户内容项

分配/删除角色X.

功能B

内容处理程序B - >评估分配的角色以及何时找到角色X并采取进一步的行动

如你所见,在我的情况下,在A之前调用处理程序B是没有意义的,因为在B甚至可以根据角色X赋值执行进一步的操作之前,必须在A中更新角色X.

目前,Autofac按以下顺序解析处理程序

... B, A, ...

但处理程序按以下顺序存储在处理程序列表中

Handlers.Invoke(handler => ..., Logger);

然后Orchard调用像

这样的处理程序
... B, A, ...

显然按顺序调用处理程序

{{1}}

我能做些什么来确保特定订单吗?

以下是谷歌小组关于类似问题的讨论:

https://groups.google.com/forum/#!topic/autofac/HE66utFpvkg

1 个答案:

答案 0 :(得分:2)

您永远不应该依赖内容处理程序的顺序。如果需要按特定顺序运行代码,则可以使用属性定义自己的处理程序接口以订购处理程序。例如:

public interface IMyHandler {
    int Priority { get; }
    void Invoke(ContentItem item);
}

您可以在Orchard模块中使用自定义Autofac模块注册此界面。然后在常规内容处理程序中,您可以注入IEnumerable<IMyHandler>。这将为您提供IMyHandler类型的所有注册处理程序。然后,您可以按Priority对它们进行排序,并在foreach循环中调用它们。

foreach (var handler in _myHandlers.OrderBy(x => x.Priority)) {
    handler.Invoke(item);
}