Sobes.tech
Junior — Middle

Can you give an example of implementing the dependency inversion principle in programming practice?

sobes.tech AI

Answer from AI

The Dependency Inversion Principle states that high-level modules should not depend on low-level modules, but both should depend on abstractions (interfaces or abstract classes).

Example in C#:

// Abstraction
public interface IMessageSender
{
    void Send(string message);
}

// Low-level implementation
public class EmailSender : IMessageSender
{
    public void Send(string message)
    {
        Console.WriteLine($"Sending email: {message}");
    }
}

// High-level module
public class NotificationService
{
    private readonly IMessageSender _messageSender;

    public NotificationService(IMessageSender messageSender)
    {
        _messageSender = messageSender;
    }

    public void Notify(string message)
    {
        _messageSender.Send(message);
    }
}

// Usage
var emailSender = new EmailSender();
var notificationService = new NotificationService(emailSender);
notificationService.Notify("Hello!");

Thus, NotificationService depends on the abstraction IMessageSender, not on the concrete implementation EmailSender, which makes replacing the implementation and testing easier.