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

Orchard CMS - How to specify the call order of content handlers?

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

示例:

特征 A

内容处理程序 A -> 从用户内容项分配/删除角色 X

功能 B

内容处理器 B -> 评估分配的角色,当找到角色 X 并采取进一步行动时

如您所见,在我的例子中,在 A 之前调用处理程序 B 是没有意义的,因为必须在 A 中更新角色 X,然后 B 才能根据角色 X 分配执行进一步的操作。

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

..., A, B, ...

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

... B, A, ...

然后 Orchard 调用处理程序,例如

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

这显然按顺序调用处理程序

... B, A, ...

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

以下是 google 组中关于类似问题的讨论:

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

您永远不应依赖内容处理程序的顺序。如果您需要 运行 以特定顺序编码,那么您可以使用 属性 定义您自己的处理程序接口来对您的处理程序进行排序。例如:

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);
}