Cover
Copyright
Table of Contents
Change History
Beta 5—November 20, 2017
Beta 4—September 6, 2017
Beta 3—July 25, 2017
Beta 2—June 28, 2017
Beta 1—June 7, 2017
Preface
Who Is This Book For?
What's In This Book?
Other Approaches To Domain Modeling
Working With the Code In This Book
Questions Or Suggestions?
Credits
Acknowledgements
Part I—Understanding the Domain
1. Introducing Domain-Driven Design
The Importance of a Shared Model
Understanding the Domain Through Business Events
Partitioning the Domain into Subdomains
Creating a Solution Using Bounded Contexts
Creating a Ubiquitous Language
Summarizing the Concepts of Domain-Driven Design
Wrapping Up
2. Understanding the Domain
Interview with a Domain Expert
Fighting the Impulse to Do Database-Driven Design
Fighting the Impulse to Do Class-Driven Design
Documenting the Domain
Diving Deeper into the Order-Taking Workflow
Representing Complexity in our Domain Model
Wrapping Up
3. A Functional Architecture
Bounded Contexts as Autonomous Software Components
Communicating Between Bounded Contexts
Contracts Between Bounded Contexts
Workflows Within a Bounded Context
Code Structure Within a Bounded Context
Wrapping Up
What's Next
Part II—Modeling the Domain
4. Understanding Types
Understanding Functions
Types and Functions
Composition of Types
Working with F# Types
Building a Domain Model by Composing Types
Modeling Optional Values, Errors, and Collections
Organizing Types in Files and Projects
Wrapping Up
5. Domain Modeling with Types
Reviewing the Domain Model
Seeing Patterns in a Domain Model
Modeling Simple Values
Modeling Complex Data
Modeling Workflows with Functions
A Question of Identity: Value Objects
A Question of Identity: Entities
Aggregates
Putting It All Together
Wrapping Up
6. Integrity and Consistency in the Domain
Integrity of Simple Values
Units of Measure
Enforcing Invariants with the Type System
Capturing Business Rules in the Type System
Consistency
Wrapping Up
7. Modeling Workflows as Pipelines
The Workflow Input
Modeling an Order as a Set of States
State Machines
Modeling Each Step in the Workflow With Types
Documenting Effects
Composing the Workflow From the Steps
Are Dependencies Part of the Design?
The Complete Pipeline
Long Running Workflows
Wrapping Up
What's Next
Part III—Implementing the Model
8. Understanding Functions
Functions, Functions, Everywhere
Functions Are Things
Total Functions
Composition
Wrapping Up
9. Implementation: Composing a Pipeline
Working With Simple Types
Using Function Types to Guide the Implementation
Implementing the Validation Step
Implementing the Rest of the Steps
Composing the Pipeline Steps Together
Injecting Dependencies
Testing Dependencies
The Assembled Pipeline
Wrapping Up
10. Implementation: Working with Errors
Using the Result Type to Make Errors Explicit
Working with Domain Errors
Chaining Result-Generating Functions
Applying "bind" and "map" to Our Pipeline
Adapting Other Kinds of Functions to the Two-Track Model
Making Life Easier with Computation Expressions
Monads and more
Adding the Async Effect
Wrapping Up
11. Serialization
Persistence vs. Serialization
Designing for Serialization
Connecting the Serialization Code to the Workflow
A Complete Serialization Example
How to Translate Domain types to DTOs
Wrapping Up
12. Persistence
Pushing Persistence to the Edges
Command-Query Separation
Bounded Contexts Must Own Their Data Storage
Working with Document Databases
Working with Relational Databases
Transactions
Wrapping Up
13. Evolving a Design and Keeping It Clean
Change 1: Adding Shipping Charges
Change 2: Adding Support for VIP Customers
Change 3: Adding Support for Promotion Codes
Change 4: Adding a Business Hours Constraint
Dealing with Additional Requirements Changes
Wrapping Up
Wrapping Up the Book