C# 是否使用ASP.NET核心';s DI容器确保服务顺序?

C# 是否使用ASP.NET核心';s DI容器确保服务顺序?,c#,asp.net-core,.net-core,dependency-injection,C#,Asp.net Core,.net Core,Dependency Injection,当我使用同一接口向DI容器注册多个服务,然后请求一个IEnumerable,容器是否保证注册顺序将是集合的顺序?因为这似乎是一种行为,但我在文档中找不到任何关于它的信息 示例-假设我们有这个接口: public interface IStep { void Execute(); } 以及一些实现: public class FirstStep : IStep { ... } public class SecondStep : IStep { ... } public class Thi

当我使用同一接口向DI容器注册多个服务,然后请求一个
IEnumerable
,容器是否保证注册顺序将是集合的顺序?因为这似乎是一种行为,但我在文档中找不到任何关于它的信息

示例-假设我们有这个接口:

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>();
可以假定这些步骤将按照注册顺序执行吗?
如果没有,实现类似管道行为的最佳方法是什么?

是的,它们按顺序执行,请阅读更多:

编辑:更具体的链接:


多亏了@Sai Puli

是的。订单以注册订单为基础,并保证

请引用您声明的部分,因为我在您共享的链接上找不到有关该部分的任何信息。如果您在本文中没有明确说明它们按注册顺序运行,那是因为它位于同一文档的不同页面中。根据@PeterT的响应搜索“中间件执行命令”。如果您在本文中没有明确指出它们是按注册顺序运行的,那是因为它是在一个数据库中。搜索“中间件执行顺序”,我个人会担心依赖这种模式
IEnumerable
不保证任何顺序(在基础类型可能存在的情况下)。如果您切换到其他DI提供程序,则此保证可能不存在。如果你依赖顺序,也许你需要其他的方式来做,而不仅仅是“注册顺序”。你介意引用并指向官方文件中的一句话吗?@Steven我认为这种行为是有记录的。
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();
        }
    }
}