Tutorials Design Patterns in C#
Dependency Injection Pattern — Complete Guide
Dependency Injection Pattern — Complete Guide: free step-by-step lesson with examples, common mistakes, and interview tips — part of Design Patterns in C# on Toolliyo Academy.
On this page
Design Patterns in C# · Lesson 28 of 69
Dependency Injection Pattern
GoF Core ✓ → Enterprise → Cloud & Craft
Enterprise · 2 — App patterns · ~6 min · Module 4: Enterprise Design Patterns
What is this?
DI supplies dependencies from the outside so classes do not construct their own infrastructure graph.
Why should you care?
ShopNest services need fakes in tests and swappable payment clients without editing constructors by hand everywhere.
See it live — copy this example
Paste into a C# console or class library project and run dotnet run.
public interface IClock { DateTime UtcNow { get; } }
public sealed class SystemClock : IClock { public DateTime UtcNow => DateTime.UtcNow; }
public sealed class OrderNumberService
{
private readonly IClock _clock;
public OrderNumberService(IClock clock) => _clock = clock;
public string Next() => $"SN-{_clock.UtcNow:yyyyMMdd}-1";
}
var svc = new OrderNumberService(new SystemClock());
Console.WriteLine(svc.Next());
Run Example »
Edit the code below and click Run to see the result in Toolliyo’s live editor.
What happened?
- OrderNumberService asks for IClock.
- Tests pass a fixed clock.
- In ASP.NET Core the container wires this automatically.
Practice next
- Print an order number.
- Inject a fake clock returning a fixed date.
- Prefer constructor injection.
- Add IIdGenerator dependency.
- Register in a Host ApplicationBuilder.
Remember
Inject dependencies. Compose at the root. Enables testing.
ShopNest testable services
Handlers take interfaces via DI.
Outcome: Unit tests run without SQL or PSP calls.
Interview prep for this lesson
Practice these questions aloud after reading—each links to a full structured answer.
Sign in to ask a question or upvote helpful answers.
No questions yet — be the first to ask!