Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does ASP.NET Core's DI container assures order of services?

When I register multiple services to the DI container with the same interface and then request an IEnumerable<IService>, do the container guarantee that the order of registration will be the order of the collection? because this seems to be the behavior but I couldn't find anything about it in the documentation.

Example - let's say we have this interface:

public interface IStep
{
    void Execute();
}

And some implementations:

public class FirstStep : IStep { ... }
public class SecondStep : IStep { ... }
public class ThirdStep : IStep { ... }
...

And we register them to the container:

services.AddTransient<IStep, FirstStep>();
services.AddTransient<IStep, SecondStep>();
services.AddTransient<IStep, ThirdStep>();

And finally request a collection of 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();
        }
    }
}

Is it okay to assume that the steps will be executed according to the order of registration? If not, what will be the best way to implement a similar pipeline behavior?

like image 883
Gur Galler Avatar asked Dec 22 '22 19:12

Gur Galler


2 Answers

Yes it does. The order is based on registration order and is guaranteed

like image 189
davidfowl Avatar answered Feb 01 '23 04:02

davidfowl


Yes they execute in order, read more: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.1

EDIT: More specific link: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-3.1#extend-startup-with-startup-filters

Thanks to @Sai Puli

like image 41
PeterT Avatar answered Feb 01 '23 03:02

PeterT