Tutorials Entity Framework Core Tutorial
Service Layer Design with EF Core
Service Layer Design with EF Core: free step-by-step lesson with examples, common mistakes, and interview tips — part of Entity Framework Core Tutorial on Toolliyo Academy.
On this page
Entity Framework Core Tutorial · Lesson 75 of 100
Service Layer Design with EF Core
Beginner ✓ → Intermediate ✓ → Advanced ✓ → Professional
Professional · 4 — Real projects · ~10 min · Module 8: Enterprise Architecture
What is this?
Service layer orchestrates use cases — calls repositories, applies business rules, controls SaveChangesAsync and transactions — without HTTP concerns.
Why should you care?
ShopNest CheckoutService calculates totals, validates stock, calls repositories, commits once — controller only maps HTTP to service call.
See it live — copy this example
Paste into a .NET project with EF Core packages, then run with LocalDB/SQL Server (dotnet ef / dotnet run).
public class CheckoutService(IUnitOfWork uow, IInventoryService inventory)
{
public async Task<Result<int>> PlaceOrderAsync(PlaceOrderRequest req, CancellationToken ct)
{
if (!await inventory.ReserveAsync(req.Lines, ct))
return Result.Fail("Insufficient stock");
var order = new Order { CustomerId = req.CustomerId };
foreach (var line in req.Lines)
order.Items.Add(new OrderItem { ProductId = line.ProductId, Quantity = line.Qty, UnitPrice = line.Price });
await uow.Orders.AddAsync(order, ct);
await uow.SaveChangesAsync(ct);
return Result.Ok(order.Id);
}
}
What happened?
- Service validates business rules before EF Add.
- UnitOfWork coordinates persistence.
- Controller stays thin — no DbContext in controller.
Practice next
- Place use-case classes in Application/Services or Handlers.
- Inject abstractions not DbContext in controllers.
- Return Result or domain errors not exceptions for business failures.
- Extract pricing policy IPricingService injected alongside repositories.
- Wrap PlaceOrderAsync in explicit transaction via UnitOfWork.
Remember
Services orchestrate business + data access. SaveChanges at use case boundary. Keep EF out of controllers.
ShopNest checkout service
CheckoutService reserves stock and creates order before payment gateway call from controller.
Outcome: Business rules centralized — not duplicated in API and background job.
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!