This is a template for creating a new project using Clean Architecture, leveraging SSW Rules & SSW's over 30 years of experience developing software in the Microsoft space.
-
🔨
dotnet new
cli template - to get you started quickly -
🚀 Aspire
- Dashboard
- Resource orchestration
- Observability
- Simple dev setup - automatic provisioning of database server, schema, and data
-
🎯 Domain Driven Design Patterns
- Super Hero Domain
- AggregateRoot
- Entity
- ValueObject
- DomainEvent
-
🌐 Minimal Endpoints - because it's fast & simple. ⚡
- Extension methods to ensure consistent HTTP Verbs & Status Codes
-
📝 OpenAPI/Scalar - easily document your API
-
🔑 Global Exception Handling - it's important to handle exceptions in a consistent way & protect sensitive information
- Transforms exceptions into a consistent format following the RFC7231 memo
-
🗄️ Entity Framework Core - for data access
- Comes with Migrations & Data Seeding
- as per ssw.com.au/rules/rules-to-better-entity-framework/
-
🧩 Specification Pattern - abstract EF Core away from your business logic
-
🔀 CQRS - for separation of concerns
-
📦 MediatR - for decoupling your application
-
📦 ErrorOr - fluent result pattern (instead of exceptions)
-
📦 FluentValidation - for validating requests
-
📦 AutoMapper - for mapping between objects
-
🆔 Strongly Typed IDs - to combat primitive obsession
- e.g. pass
CustomerId
type into methods instead ofint
, orGuid
- Entity Framework can automatically convert the int, Guid, nvarchar(..) to strongly typed ID.
- e.g. pass
-
📁 Directory.Build.Props
- Consistent build configuration across all projects in the solution
- e.g. Treating Warnings as Errors for Release builds
- Custom per project
- e.g. for all test projects we can ensure that the exact same versions of common packages are referenced
- e.g. XUnit and NSubstitute packages for all test projects
- Consistent build configuration across all projects in the solution
-
⚖️ EditorConfig - comes with the SSW.EditorConfig
- Maintain consistent coding styles for individual developers or teams of developers working on the same project using different IDEs
- as per ssw.com.au/rules/consistent-code-style/
-
🧪 Testing
- as per ssw.com.au/rules/rules-to-better-testing/
- Simpler Unit Tests for Application
- No Entity Framework mocking required thanks to Specifications
- as per ssw.com.au/rules/rules-to-better-unit-tests/
- Better Integration Tests
- Using Respawn and TestContainers
- Integration Tests at Unit Test speed
- Test Commands and Queries against a Real database
- No Entity Framework mocking required
- No need for In-memory database provider
- Architecture Tests
- Using NetArchTest
- Know that the team is following the same Clean Architecture fundamentals
- The tests are automated so discovering the defects is fast
- Install the SSW CA template
dotnet new install SSW.CleanArchitecture.Template
NOTE: The template only needs to be installed once. Running this command again will update your version of the template.
- Create a new directory
mkdir Northwind365
cd Northwind365
- Create a new solution
dotnet new ssw-ca
NOTE:
name
is optional; if you don't specify it, the directory name will be used as the solution name and project namespaces.
Alternatively, you can specify the name
and output
directory as follows:
dotnet new ssw-ca --name {{SolutionName}} --output .\
- Create a query
cd src/Application/Features
mkdir {{FeatureName}}
cd {{FeatureName}}
dotnet new ssw-ca-query --name {{QueryName}} --entityName {{Entity}} --slnName {{SolutionName}}
- Create a command
cd src/Application/Features
mkdir {{FeatureName}}
cd {{FeatureName}}
dotnet new ssw-ca-command --name {{CommandName}} --entityName {{Entity}} --slnName {{SolutionName}}
-
Change directory
Windows:
cd tools\AppHost\
Mac/Linux:
cd tools/AppHost/
-
Run the solution
dotnet run
NOTE: The first time you run the solution, it may take a while to download the docker images, create the DB, and seed the data.
- Open http://localhost:5024/swagger/index.html in your browser to see it running ️🏃♂️
Template will be published to NuGet.org when changes are made to CleanArchitecture.nuspec
on the main
branch.
- Update the
version
attribute inCleanArchitecture.nuspec
- Merge your PR
package
GitHub Action will run and publish the new version to NuGet.org- Create a GitHub release to document the changes
NOTE: We are now using CalVer for versioning. The version number should be in the format
YYYY.M.D
(e.g.2024.2.12
).
If you're interested in learning more about Clean Architecture SSW offers two events:
You're interested learning more about Clean Architecture, please see this excellent video by Matt Goldman:
Alternatively, SSW has many great rules about Clean Architecture:
You can also find a collection of commumity projects built on Clean Architecture here:
Contributions, issues and feature requests are welcome! See Contributing for more information.