ASP.NET Core: Built-in IoC Container
ASP.NET Core framework includes built-in IoC container for automatic dependency injection. The built-in IoC container is a simple yet effective container. Let's understand how the built-in IoC container works internally.
The followings are important interfaces and classes for built-in IoC container:
The following diagram illustrates the relationship between these classes:
As you know, we can register application services with built-in IoC container in the Configure method of Startup class by using IServiceCollection. IServiceCollection interface is an empty interface. It just inherits
IList<servicedescriptor>. See the source code here.
The ServiceCollection class implements IServiceCollection interface. See the ServiceCollection source code here.
So, the services you add in the
IServiceCollection type instance, it actually creates an instance of ServiceDescriptor and adds it to the list.
GetService method. The
ServiceProvider class implements
IServiceProvider interface which returns registered services with the container.
We cannot instantiate
ServiceProvider class because its constructors are marked with internal access modifier.
ServiceCollectionServiceExtensions class includes extension methods related to service registrations which can be used to add services with lifetime. AddSingleton, AddTransient, AddScoped extension methods defined in this class.
ServiceCollectionContainerBuilderExtensions class includes
BuildServiceProvider extension method which creates and returns an instance of
There are three ways to get an instance of
We can get the services in Configure method using IApplicationBuilder's
ApplicationServices property as shown below.
public void Configure(IServiceProvider pro, IApplicationBuilder app, IHostingEnvironment env)
var services = app.ApplicationServices;
var logger = services.GetService<ILog>() }
//other code removed for clarity
var services = HttpContext.RequestServices;
var log = (ILog)services.GetService(typeof(ILog));
public void ConfigureServices(IServiceCollection services)
var serviceProvider = services.BuildServiceProvider();