我赞同 Leo 的建议,即您所追求的是处理程序过滤器。
在我的博客上,我有一个关于如何制作简单处理程序过滤器的示例,这恰好是在解决它们时ResolveAll<ITask>
(或在IEnumerable<ITask>
注入时)产生有序任务实例的示例:
class TaskHandlersFilter : IHandlersFilter
{
readonly Dictionary<Type, int> sortOrder =
new Dictionary<Type, int>
{
{typeof (PrepareSomething), 1},
{typeof (CarryItOut), 2},
{typeof (FinishTheJob), 3},
};
public bool HasOpinionAbout(Type service)
{
return service == typeof(ITask);
}
public IHandler[] SelectHandlers(Type service, IHandler[] handlers)
{
// come up with some way of ordering implementations here
// (cool solution coming up in the next post... ;))
return handlers
.OrderBy(h => sortOrder[h.ComponentModel.Implementation])
.ToArray();
}
}
我还有一个更详细的示例,它使用用于指定排序的 API - 在这种情况下,我允许类型指定它们相对于另一种类型的位置,例如
[ExecutesBefore(typeof(ExecutePayment))]
public class ValidateCreditCards : ITask { ... }
在您的具体情况下可能/可能没有用:)