As you know ASP.NET Core is designed from the ground up to support and leverage dependency injection. In this tutorial i show you how to use dependency injection in ASP.NET Core.

Dependency injection (DI) is a technique for achieving loose coupling between objects and their collaborators, or dependencies. Rather than directly instantiating collaborators, or using static references, the objects a class needs in order to perform its actions are provided to the class in some fashion.

Open Visual Studio->File->New->Project->Select ASP.NET Core Web Application template

We will create a simple repository to insert update delete data to our database

public class Company
{
    public Guid Id { get; set; }
    public string CompanyName { get; set; }
    public string Address { get; set; }
    public string Phone { get; set; }
    public string Fax { get; set; }
    public string TaxId { get; set; }
    public string AccountNumber { get; set; }
    public string BankName { get; set; }
    public string Email { get; set; }
    public string Website { get; set; }
}

Create a generic interface as below

public interface IRepository<T> where T : class
{
    List<T> GetAll();
    Guid Insert(T obj);
    bool Update(T obj);
    bool Delete(Guid id);
}

Create an interface, then inheritance IRepository

public interface ICompanyRepository : IRepository<Company>
{
}

Create a repository class then implement ICompanyRepository interface, we alway use interface to call methods

public class CompanyRepository : ICompanyRepository
{
    public bool Delete(Guid id)
    {
        throw new NotImplementedException();
    }

    public List<Company> GetAll()
    {
        throw new NotImplementedException();
    }

    public Guid Insert(Company obj)
    {
        throw new NotImplementedException();
    }

    public bool Update(Company obj)
    {
        throw new NotImplementedException();
    }
}

Open Startup class, then add a config service as below to the ConfigureServices method

services.AddTransient<ICompanyRepository, CompanyRepository>();

There are three options for DI container in ASP.NET Core:

Singleton: Only a single instance will be created and shared

Scoped: An instance is created once per scope

Transient: Create every time they are requested and are never shared.

services.AddScoped<ICompanyRepository, CompanyRepository>();
services.AddSingleton<ICompanyRepository, CompanyRepository>();

To use DI you need to create a controller, then add code as below

public class CompanyController : Controller
{
    private readonly ICompanyRepository _companyRepository;

    public CompanyController(ICompanyRepository companyRepository)
    {
        _companyRepository = companyRepository;
    }    

    [HttpGet]
    public JsonResult GetAll()
    {
        return Json(_companyRepository.GetAll(), JsonRequestBehavior.AllowGet);
    }

    [HttpPost]
    public JsonResult Create(Company obj)
    {
        return Json(new { id = _companyRepository.Insert(obj) });
    }

    [HttpPut]
    public JsonResult Update(Company obj)
    {
        return Json(new { success = _companyRepository.Update(obj) });
    }

    [HttpDelete]
    public JsonResult Delete(Guid id)
    {
        return Json(new { success = _companyRepository.Delete(id) });
    }
}