Skip to content

References

  • GitHub: https://github.com/hhko/Functorium
  • Repository types: Src/Functorium/Domains/Repositories/
  • Query adapters: Src/Functorium/Applications/Queries/
  • Usecase interfaces: Src/Functorium/Applications/Usecases/

  • Title: Domain-Driven Design: Tackling Complexity in the Heart of Software
  • Author: Eric Evans
  • Publisher: Addison-Wesley, 2003
  • Key content: Foundational definitions of Entity, Aggregate Root, Repository, and Specification patterns
  • Title: Implementing Domain-Driven Design
  • Author: Vaughn Vernon
  • Publisher: Addison-Wesley, 2013
  • Key content: Practical DDD implementation, CQRS and Event Sourcing

Patterns of Enterprise Application Architecture

Section titled “Patterns of Enterprise Application Architecture”
  • Title: Patterns of Enterprise Application Architecture
  • Author: Martin Fowler
  • Publisher: Addison-Wesley, 2002
  • Key content: Repository pattern, Unit of Work pattern, Query Object pattern
  • Title: Functional Programming in C#: How to write better C# code
  • Author: Enrico Buonanno
  • Publisher: Manning, 2022 (2nd Edition)
  • Key content: Functional programming, monads, error handling

Greg Young’s CQRS Documents

Martin Fowler’s CQRS

Microsoft CQRS Pattern

Martin Fowler’s Repository Pattern

Martin Fowler’s Unit of Work

Eric Evans & Martin Fowler’s Specification Pattern


LibraryDescriptionNuGet
FunctoriumThe CQRS framework for this tutorial-
MediatorSource Generator-based Mediator patternYes
LibraryDescriptionNuGet
Microsoft.EntityFrameworkCoreEF Core ORM (Command side)Yes
DapperLightweight ORM (Query side)Yes
LibraryDescriptionNuGet
LanguageExt.CoreFunctional programming types (Fin, FinT, IO)Yes
LibraryDescriptionNuGet
xUnitTest frameworkYes
ShouldlyAssertion libraryYes
NSubstituteMock libraryYes

Src/Functorium/
├── Domains/
│ ├── Entities/ # Entity<TId>, AggregateRoot<TId>, IEntityId
│ ├── Repositories/ # IRepository<TAggregate, TId>
│ └── Specifications/ # Specification<T>
├── Applications/
│ ├── Queries/ # IQueryPort<TEntity, TDto>
│ ├── Usecases/ # ICommandRequest, IQueryRequest, FinResponse
│ └── Persistence/ # IUnitOfWork, IUnitOfWorkTransaction
Src/Functorium.Adapters/
├── Repositories/ # InMemoryRepositoryBase, EfCoreRepositoryBase
├── Events/ # DomainEventCollector
└── Observabilities/Pipelines/ # UsecaseTransactionPipeline
Docs.Site/src/content/docs/tutorials/cqrs-repository/
├── Part1-Domain-Entity-Foundations/ # Domain entities (4)
├── Part2-Command-Repository/ # Repository pattern (4)
├── Part3-Query-Patterns/ # Query patterns (5)
├── Part4-CQRS-Usecase-Integration/ # Usecase integration (5)
└── Part5-Domain-Examples/ # Practical examples (4)

This tutorial is more effective when studied alongside the following tutorials:


  1. Repository chapter from Eric Evans’ DDD book
  2. Part 1 of this tutorial
  3. Read Functorium Repository/Entity source code
  1. Martin Fowler’s CQRS document
  2. Parts 2~3 of this tutorial
  3. EF Core / Dapper official documentation
  1. Greg Young’s CQRS Documents
  2. Parts 4~5 of this tutorial
  3. Advanced study of LanguageExt functional types

This tutorial was written based on real-world CQRS framework development experience with the Functorium project.