当我注册多个具有相同接口的服务到 DI 容器中,并请求一个
例如 - 假设我们有以下接口:
IEnumerable<IService>
时,容器是否保证注册顺序为集合的顺序?因为这似乎是预期行为,但我在文档中没有找到任何内容来证实它。例如 - 假设我们有以下接口:
public interface IStep
{
void Execute();
}
以下是一些实现:
public class FirstStep : IStep { ... }
public class SecondStep : IStep { ... }
public class ThirdStep : IStep { ... }
...
然后,我们将它们注册到容器中:
services.AddTransient<IStep, FirstStep>();
services.AddTransient<IStep, SecondStep>();
services.AddTransient<IStep, ThirdStep>();
最后请求获取一个IStep
的集合:
public class Plan
{
private readonly IEnumerable<IStep> steps;
public Plan(IEnumerable<IStep> steps)
{
this.steps = steps;
}
public void Execute()
{
foreach (var step in steps)
{
step.Execute();
}
}
}
可以假设步骤将按照注册顺序执行吗?如果不行,实现类似的管道行为的最佳方法是什么?
IEnumerable
不保证任何排序(尽管基础类型可能会)。如果您切换到其他 DI 提供程序,则此保证可能不存在。如果您依赖顺序,也许您需要采用其他方法来处理,而不仅仅是“注册顺序”。 - Neil