Dependency Injection in .NET: A Comprehensive Guide

Dependency Injection in .NET: A Comprehensive Guide Introduction to Dependency Injection (DI) Dependency Injection (DI) is a design pattern used to achieve Inversion of Control (IoC) in software development.
It allows objects to receive their dependencies from an external source rather than creating them internally, making applications more maintainable, testable, and loosely coupled.
Loose Coupling: Reduces dependencies between components.
Improved Testability: Makes unit testing easier by enabling mock dependencies.
Scalability: Helps manage dependencies efficiently as the application grows.
Separation of Concerns: Keeps business logic independent of infrastructure concerns.
Types of Dependency Injection in .NET Constructor Injection (Most Common) Method Injection Property Injection Dependency Injection in .NET Core and .NET 5+ .NET has a built-in Dependency Injection (DI) container that simplifies dependency management.
1. Registering Services in the DI Container In .NET applications, dependencies are registered in the ConfigureServices method of Program.cs:
csharp
var builder = WebApplication.CreateBuilder(args); builder.Services.AddTransient<IMyService, MyService>(); var app = builder.Build();
2. Service Lifetime in Dependency Injection .NET provides three service lifetimes: Lifetime Description Example Transient A new instance is created every time it’s requested.
services.AddTransient<IMyService, MyService>(); Scoped A new instance is created per request (for web applications). services.AddScoped<IMyService, MyService>(); Singleton A single instance is created and shared throughout the application’s lifetime. services.AddSingleton<IMyService, MyService>();
Implementing Dependency Injection in .NET
Example 1: Constructor Injection
Step 1: Define an Interface
csharp
public interface IMessageService { void SendMessage(string message); }
Step 2: Implement the Interface csharp Copy Edit public class EmailService : IMessageService { public void SendMessage(string message) { Console.WriteLine($”Email sent: {message}”); } }
Step 3: Register the Service
csharp
var builder = WebApplication.CreateBuilder(args); builder.Services.AddTransient<IMessageService, EmailService>(); var app = builder.Build();
Step 4: Inject Dependency in a Controller
csharp
public class HomeController { private readonly IMessageService _messageService; public HomeController(IMessageService messageService) { _messageService = messageService; } public void SendNotification() { _messageService.SendMessage(“Hello, Dependency Injection!”); } }
Advanced DI Concepts
1. Injecting Multiple Implementations If you have multiple implementations of an interface, you can inject them using IEnumerable<T>.
csharp
public class NotificationService { private readonly IEnumerable<IMessageService> _messageServices;
public NotificationService(IEnumerable<IMessageService> messageServices) { _messageServices = messageServices; } public void NotifyAll(string message) { foreach (var service in _messageServices) { service.SendMessage(message); } } }
2. Using Factory Methods You can use a factory pattern for more control over dependency creation. csharp Copy Edit builder.Services.AddTransient<IMessageService>(provider => new EmailService());
3. Configuring Options with IOptions<T> For settings-based dependency injection: csharp Copy Edit public class EmailSettings { public string SmtpServer { get; set; } } builder.Services.Configure<EmailSettings>(builder.Configuration.GetSection(“EmailSettings”));
Dependency Injection in .NET simplifies object creation, promotes maintainability, and enhances testability. By leveraging .NET’s built-in DI container, developers can efficiently manage dependencies and build scalable applications.
WEBSITE: https://www.ficusoft.in/dot-net-training-in-chennai/
Comments
Post a Comment