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 组中关于类似问题的讨论:
您永远不应依赖内容处理程序的顺序。如果您需要 运行 以特定顺序编码,那么您可以使用 属性 定义您自己的处理程序接口来对您的处理程序进行排序。例如:
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);
}
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 组中关于类似问题的讨论:
您永远不应依赖内容处理程序的顺序。如果您需要 运行 以特定顺序编码,那么您可以使用 属性 定义您自己的处理程序接口来对您的处理程序进行排序。例如:
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);
}