Clean Architecture
Jason Taylor
Join the Conversation #GOTOCph @JasonGtAu
Join the Conversation #GOTOCph @JasonGtAu
Jason Taylor
SSW Solution Architect
Visiting from Australia
.NET Developer Since 2002
Keep It Simple, Stupid!
jasongtau github.com/jasongt
codingflow.net youtube.com/jasongt
Join the Conversation #DotNetCoreSuperpowers @SSW_TV
Clean Architecture
Domain Layer
Application Layer
Agenda Infrastructure Layer
Presentation Layer
Next Steps
Clean Architecture
Presentation
Application
Independent of frameworks
Testable
Domain
Independent of UI
Independent of database
Independent anything external
Infrastructure
Join the Conversation #GOTOCph @JasonGtAu
Northwind Traders Sample
Clean Architecture
ASP.NET Core 3.0
Entity Framework Core 3.0
ASP.NET Core Identity 3.0
Repo bit.ly/northwind-traders
Join the Conversation #GOTOCph @JasonGtAu
Clean Architecture Template
.NET Core Template Package
ASP.NET Core 3.0
Entity Framework Core 3.0
ASP.NET Core Identity 3.0
Repo bit.ly/ca-sln
Join the Conversation #GOTOCph @JasonGtAu
Key Points
Domain contains enterprise-wide logic and types
Application contains business-logic and types
Infrastructure contains all external concerns
Presentation and Infrastructure depend only on Application
Infrastructure and Presentation components can be replaced
with minimal effort
Join the Conversation #GOTOCph @JasonGtAu
Clean Architecture
Domain Layer
Application Layer
Agenda Infrastructure Layer
Presentation Layer
Next Steps
Overview
Presentation
Application
Entities
Value Objects
Domain
Enumerations
Logic
Exceptions Infrastructure
Join the Conversation #GOTOCph @JasonGtAu
Demo
Reviewing the Domain layer
Join the Conversation #GOTOCph @JasonGtAu
Key Points
Avoid using data annotations
Use value objects where appropriate
Create custom domain exceptions
Initialise all collections & use private setters
Automatically track changes
Join the Conversation #GOTOCph @JasonGtAu
Clean Architecture
Domain Layer
Application Layer
Agenda Infrastructure Layer
Presentation Layer
Next Steps
Overview
Presentation
Application
Interfaces
Models
Domain
Logic
Commands / Queries
Validators
Exceptions Infrastructure
Join the Conversation #GOTOCph @JasonGtAu
CQRS
Command Query Responsibility Segregation
Separate reads (queries) from writes (commands)
Can maximise performance, scalability, and simplicity
Easy to add new features, just add a new query or command
Easy to maintain, changes only affect one command or query
Join the Conversation #GOTOCph @JasonGtAu
CQRS + MediatR = ♥
Define commands and queries as requests
Application layer is just a series of request / response
objects
Ability to attach additional behaviour before and / or
after each request, e.g. logging, validation, caching,
authorisation and so on
Join the Conversation #GOTOCph @JasonGtAu
Demo
Reviewing the Application layer
Join the Conversation #GOTOCph @JasonGtAu
Key Points
Using CQRS + MediatR simplifies your overall design
MediatR simplifies cross cutting concerns
Fluent Validation is useful for all validation scenarios
AutoMapper simplifies mapping and projections
Independent of infrastructure concerns
Join the Conversation #GOTOCph @JasonGtAu
Clean Architecture
Domain Layer
Application Layer
Agenda Infrastructure Layer
Presentation Layer
Next Steps
Overview
Presentation
Application
Persistence
Identity
Domain
File System
System Clock
API Clients Infrastructure
Join the Conversation #GOTOCph @JasonGtAu
Unit of Work and Repository Patterns
Should we implement these patterns?
It isn’t always the best choice, because:
EF Core insulates your code from database changes
DbContext acts as a unit of work
DbSet acts as a repository
EF Core has features for unit testing without repositories
Join the Conversation #GOTOCph @JasonGtAu
What do the experts think?
I’m over Repositories, and No, you don’t need a repository. No, the repository/unit-of-work
definitely over abstracting your But there are many benefits pattern isn’t useful with EF
data layer. and you should consider it! Core.
Join the Conversation #GOTOCph @JasonGtAu
Demo
Reviewing the Infrastructure layer
Join the Conversation #GOTOCph @JasonGtAu
Key Points
Independent of the database
Use Fluent API configuration over data annotations
Prefer conventions over configuration
Automatically apply all entity type configurations
No layers depend on Infrastructure layer, e.g.
Presentation layer
Join the Conversation #GOTOCph @JasonGtAu
Clean Architecture
Domain Layer
Application Layer
Agenda Infrastructure Layer
Presentation Layer
Next Steps
Overview
Presentation
Application
SPA – Angular, React, Vue
Web API Domain
Razor Pages
MVC
Web Forms Infrastructure
Join the Conversation #GOTOCph @JasonGtAu
Demo
Reviewing the Presentation layer
Join the Conversation #GOTOCph @JasonGtAu
Key Points
Controllers should not contain any application logic
Create and consume well defined view models
Open API bridges the gap between the front end and
back end
NSwag automates generation of Open API
specification and clients
Join the Conversation #GOTOCph @JasonGtAu
Clean Architecture
Domain Layer
Application Layer
Agenda Infrastructure Layer
Presentation Layer
Next Steps
Using the Solution Template
C:\Code\CaTodo>dotnet new -i Clean.Architecture.Solution.Template
C:\Code\CaTodo>dotnet new ca-sln
The template "Clean Architecture Solution" was created successfully.
C:\Code\CaTodo>
Join the Conversation #GOTOCph @JasonGtAu
Join the Conversation #GOTOCph @JasonGtAu
Join the Conversation #GOTOCph @JasonGtAu
Thank you!
@jasongtau
bit.ly/ca-sln
bit.ly/northwind-traders
[email protected]
www.ssw.com.au
Sydney | Melbourne | Brisbane