Author : MD TAREQ HASSAN | Updated : 2020/05/05
Setup DI in aspnet core
- aspnet core has built-in DI container
 - the container resolves the dependencies in the graph and returns the fully resolved service
 - registration scopes: scope and service lifetime
 - details: dependency injection
 
Create Interface 
IFoo.cs
public interface IFoo
{
    Task<Foo> GetFoo(int id);
}
Implement Interface  
FooRepository.cs
public class FooRepository : IFoo
{
    public async Task<Foo> GetFoo(int id)
    {
    
        // ... ... ...
        
        return await ...;
    }
}
Register to DI container  
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    // ... ... ...
    
    services.AddScoped<IFoo, FooRepository>(); // AddSingleton, AddTransient
    // ... ... ...
}
Constructor injection
ProductService.cs
public class ProductService
{
    private readonly IFoo _fooRepository;
    
    public ProductService(IFoo fooRepository)
    {
        _fooRepository = fooRepository;
    }
    
    public void DeleteFoo(int id)
    {
        _fooRepository.Delete(id);
    }
}
Registering DBContext
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<FooDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("FooDBConnection")));
   
    // ... ... ...
}
Details: using-dbcontext-with-dependency-injection
Register multiple services in extension method
ServiceExtensions.cs
public static class ServiceExtensions
{
    public static IServiceCollection RegisterServices(
        this IServiceCollection services)
    {
        services.AddTransient<ITopicAreaService, TopicAreaService>();
        
        // Add all other services here.
        return services;
    }
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.RegisterServices(); // using extension method to register all DI related classes
    
    // Add framework services.
    services.AddMvc();
}