Autofac解析的内容处理程序以不可预测的顺序返回。我需要按特定顺序调用一些内容处理程序。
示例:
功能A
内容处理程序A - >从用户内容项
分配/删除角色X.功能B
内容处理程序B - >评估分配的角色以及何时找到角色X并采取进一步的行动
如你所见,在我的情况下,在A之前调用处理程序B是没有意义的,因为在B甚至可以根据角色X赋值执行进一步的操作之前,必须在A中更新角色X.
目前,Autofac按以下顺序解析处理程序
... B, A, ...
但处理程序按以下顺序存储在处理程序列表中
Handlers.Invoke(handler => ..., Logger);
然后Orchard调用像
这样的处理程序... B, A, ...
显然按顺序调用处理程序
{{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);
}