ASP.NET Core的DI容器是否保证服务的顺序?

10
当我注册多个具有相同接口的服务到 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();
        }
    }
}

可以假设步骤将按照注册顺序执行吗?如果不行,实现类似的管道行为的最佳方法是什么?


基于@PeterT的回复,如果您在本文中没有明确说明它们按注册顺序运行,那是因为它在同一文档的不同页面中。搜索“中间件执行顺序”。 - Sai Puli
3
个人而言,我会对依赖于这种模式持谨慎态度。IEnumerable 不保证任何排序(尽管基础类型可能会)。如果您切换到其他 DI 提供程序,则此保证可能不存在。如果您依赖顺序,也许您需要采用其他方法来处理,而不仅仅是“注册顺序”。 - Neil
2个回答

10

是的,它确实可以。订单是根据注册顺序排序并得到保证。


6
请问您能否引用并指出官方文档中的某个声明? - Steven
2
@Steven 我认为这个行为在这里有记录。 - Enrico Massone

4

请引用您所声称的部分,因为我在您分享的链接中找不到任何相关信息。 - Jérôme MEVEL
如果您在本文中没有明确说明它们按注册顺序运行,那是因为它在同一文档的不同页面上,https://learn.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-3.1#extend-startup-with-startup-filters。搜索“中间件执行顺序”。 - Sai Puli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接