Контейнер DI ASP. NET Core обеспечивает порядок услуг? - PullRequest
2 голосов
/ 06 марта 2020

Когда я регистрирую несколько служб в контейнере 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();
        }
    }
}

Можно ли предположить, что шаги будут выполнены в соответствии с порядком регистрации? Если нет, то как лучше всего реализовать подобное поведение конвейера?

Ответы [ 2 ]

2 голосов
/ 09 марта 2020

Да, это так. Заказ основывается на оформлении заказа и гарантируется

1 голос
/ 06 марта 2020

Да, они выполняются по порядку, подробнее: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.1

РЕДАКТИРОВАТЬ: Подробнее c ссылка: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-3.1#extend -startup-with-startup-filters

Благодаря @ Сай Пули

...