Understanding Dependency Injection in .NET for Beginners

Gemini_Generated_Image_k6myuek6myuek6my

Introduction

Modern software development focuses on writing clean, maintainable, and scalable code. One of the key design principles that helps achieve this in .NET applications is Dependency Injection (DI).

Dependency Injection is widely used in ASP.NET Core applications and plays an important role in building loosely coupled and testable systems.

In this blog, we will explore what Dependency Injection is, why it is important, and how it works in .NET.

What is Dependency Injection?

Dependency Injection is a design pattern used to achieve loose coupling between classes.

Instead of creating dependencies directly inside a class, the required objects are provided from outside.

This makes the code:

  • Easier to maintain

  • Easier to test

  • More flexible

Example Without Dependency Injection

Consider the following example:

public class ProductService
{
    private ProductRepository repository;

    public ProductService()
    {
        repository = new ProductRepository();
    }

    public void GetProducts()
    {
        repository.GetAll();
    }
}

In this example, ProductService directly creates an instance of ProductRepository.

This creates tight coupling, which makes testing and maintenance difficult.

Example With Dependency Injection

Using Dependency Injection, the dependency is provided externally.

public class ProductService
{
    private readonly ProductRepository repository;

    public ProductService(ProductRepository repository)
    {
        this.repository = repository;
    }

    public void GetProducts()
    {
        repository.GetAll();
    }
}

Now ProductService does not create the dependency itself.

Instead, the dependency is injected through the constructor.

Dependency Injection in ASP.NET Core

ASP.NET Core includes a built-in Dependency Injection container.

Services are registered in Program.cs.

Example:

builder.Services.AddScoped<ProductService>();

After registration, ASP.NET Core automatically injects the service where it is needed.

Types of Dependency Injection

There are three common types of DI:

1. Constructor Injection

Dependencies are provided through the class constructor.

2. Property Injection

Dependencies are set through properties.

3. Method Injection

Dependencies are passed through method parameters.

Constructor injection is the most commonly used approach in .NET.

Service Lifetimes in .NET

When registering services in ASP.NET Core, you can define their lifetime.

Transient

A new instance is created every time it is requested.

Scoped

A single instance is created per request.

Singleton

A single instance is created for the entire application.

Example:

builder.Services.AddSingleton<ProductService>();

Why Dependency Injection is Important

Dependency Injection offers several advantages:

  • Reduces tight coupling

  • Improves testability

  • Makes applications easier to maintain

  • Encourages clean architecture

It is an essential concept for modern ASP.NET Core development.

Conclusion

Dependency Injection is a powerful design pattern that helps developers build flexible and maintainable applications. Understanding how DI works is an important step for every developer learning .NET and ASP.NET Core.

By mastering Dependency Injection, developers can design better software architectures and write cleaner code.