Foreword |
|
xiii | |
Preface |
|
xv | |
Introduction |
|
xxiii | |
|
|
|
1 Analyzing Business Domains |
|
|
3 | (18) |
|
What Is a Business Domain? |
|
|
3 | (1) |
|
|
4 | (10) |
|
|
4 | (3) |
|
|
7 | (4) |
|
Identifying Subdomain Boundaries |
|
|
11 | (3) |
|
|
14 | (3) |
|
|
14 | (1) |
|
|
15 | (2) |
|
Who Are the Domain Experts? |
|
|
17 | (1) |
|
|
18 | (1) |
|
|
18 | (3) |
|
2 Discovering Domain Knowledge |
|
|
21 | (12) |
|
|
21 | (1) |
|
|
22 | (1) |
|
|
22 | (2) |
|
What Is a Ubiquitous Language? |
|
|
24 | (1) |
|
|
25 | (2) |
|
|
25 | (1) |
|
|
26 | (1) |
|
Model of the Business Domain |
|
|
27 | (4) |
|
|
27 | (1) |
|
|
28 | (1) |
|
Modeling the Business Domain |
|
|
28 | (1) |
|
|
29 | (1) |
|
|
29 | (1) |
|
|
30 | (1) |
|
|
31 | (1) |
|
|
32 | (1) |
|
3 Managing Domain Complexity |
|
|
33 | (16) |
|
|
33 | (2) |
|
What Is a Bounded Context? |
|
|
35 | (3) |
|
|
36 | (1) |
|
Ubiquitous Language Refined |
|
|
37 | (1) |
|
Scope of a Bounded Context |
|
|
37 | (1) |
|
Bounded Contexts Versus Subdomains |
|
|
38 | (3) |
|
|
39 | (1) |
|
|
39 | (1) |
|
The Interplay Between Subdomains and Bounded Contexts |
|
|
39 | (2) |
|
|
41 | (1) |
|
|
41 | (1) |
|
|
42 | (1) |
|
Bounded Contexts in Real Life |
|
|
42 | (4) |
|
|
43 | (1) |
|
|
43 | (1) |
|
|
44 | (2) |
|
|
46 | (1) |
|
|
46 | (3) |
|
4 Integrating Bounded Contexts |
|
|
49 | (14) |
|
|
50 | (3) |
|
|
50 | (1) |
|
|
50 | (3) |
|
|
53 | (3) |
|
|
53 | (1) |
|
|
54 | (1) |
|
|
55 | (1) |
|
|
56 | (1) |
|
|
56 | (1) |
|
|
56 | (1) |
|
|
56 | (1) |
|
|
57 | (2) |
|
|
58 | (1) |
|
|
58 | (1) |
|
|
59 | (1) |
|
|
59 | (4) |
|
|
|
5 Implementing Simple Business Logic |
|
|
63 | (12) |
|
|
63 | (6) |
|
|
64 | (1) |
|
|
64 | (4) |
|
When to Use Transaction Script |
|
|
68 | (1) |
|
|
69 | (3) |
|
|
70 | (1) |
|
When to Use Active Record |
|
|
71 | (1) |
|
|
72 | (1) |
|
|
72 | (1) |
|
|
72 | (3) |
|
6 Tackling Complex Business Logic |
|
|
75 | (24) |
|
|
75 | (1) |
|
|
76 | (19) |
|
|
77 | (1) |
|
|
77 | (17) |
|
|
94 | (1) |
|
|
95 | (1) |
|
|
96 | (3) |
|
7 Modeling the Dimension of Time |
|
|
99 | (18) |
|
|
99 | (9) |
|
|
104 | (1) |
|
|
105 | (2) |
|
|
107 | (1) |
|
|
107 | (1) |
|
Event-Sourced Domain Model |
|
|
108 | (4) |
|
|
110 | (1) |
|
|
111 | (1) |
|
Frequently Asked Questions |
|
|
112 | (3) |
|
|
112 | (2) |
|
|
114 | (1) |
|
|
114 | (1) |
|
|
115 | (1) |
|
|
116 | (1) |
|
|
117 | (20) |
|
Business Logic Versus Architectural Patterns |
|
|
117 | (1) |
|
|
118 | (7) |
|
|
118 | (1) |
|
|
119 | (1) |
|
|
119 | (1) |
|
Communication Between Layers |
|
|
120 | (1) |
|
|
121 | (3) |
|
When to Use Layered Architecture |
|
|
124 | (1) |
|
|
125 | (3) |
|
|
126 | (1) |
|
Dependency Inversion Principle |
|
|
126 | (1) |
|
Integration of Infrastructural Components |
|
|
127 | (1) |
|
|
128 | (1) |
|
When to Use Ports & Adapters |
|
|
128 | (1) |
|
Command-Query Responsibility Segregation |
|
|
128 | (6) |
|
|
129 | (1) |
|
|
129 | (1) |
|
|
130 | (2) |
|
|
132 | (1) |
|
|
133 | (1) |
|
|
133 | (1) |
|
|
134 | (1) |
|
|
135 | (1) |
|
|
135 | (2) |
|
|
137 | (22) |
|
|
137 | (6) |
|
Stateless Model Translation |
|
|
138 | (3) |
|
Stateful Model Translation |
|
|
141 | (2) |
|
|
143 | (11) |
|
|
145 | (2) |
|
|
147 | (3) |
|
|
150 | (4) |
|
|
154 | (1) |
|
|
154 | (5) |
|
Part III Applying Domain-Driven Design in Practice |
|
|
|
|
159 | (10) |
|
|
159 | (1) |
|
|
160 | (1) |
|
Business Logic Implementation Patterns |
|
|
161 | (2) |
|
|
163 | (1) |
|
|
164 | (2) |
|
|
165 | (1) |
|
|
165 | (1) |
|
|
165 | (1) |
|
Tactical Design Decision Tree |
|
|
166 | (1) |
|
|
167 | (1) |
|
|
167 | (2) |
|
11 Evolving Design Decisions |
|
|
169 | (16) |
|
|
169 | (3) |
|
|
170 | (1) |
|
|
170 | (1) |
|
|
171 | (1) |
|
|
171 | (1) |
|
|
172 | (1) |
|
|
172 | (1) |
|
Strategic Design Concerns |
|
|
172 | (1) |
|
|
173 | (5) |
|
Transaction Script to Active Record |
|
|
174 | (1) |
|
Active Record to Domain Model |
|
|
174 | (2) |
|
Domain Model to Event-Sourced Domain Model |
|
|
176 | (1) |
|
Generating Past Transitions |
|
|
176 | (1) |
|
Modeling Migration Events |
|
|
177 | (1) |
|
|
178 | (1) |
|
Partnership to Customer--Supplier |
|
|
179 | (1) |
|
Customer--Supplier to Separate Ways |
|
|
179 | (1) |
|
|
179 | (1) |
|
|
180 | (2) |
|
|
180 | (1) |
|
|
181 | (1) |
|
|
182 | (1) |
|
|
182 | (1) |
|
|
183 | (2) |
|
|
185 | (16) |
|
|
185 | (1) |
|
Who Should Participate in EventStorming? |
|
|
186 | (1) |
|
What Do You Need for EventStorming? |
|
|
186 | (1) |
|
The EventStorming Process |
|
|
187 | (8) |
|
Step 1 Unstructured Exploration |
|
|
187 | (1) |
|
|
188 | (1) |
|
|
189 | (1) |
|
|
190 | (1) |
|
|
190 | (1) |
|
|
191 | (1) |
|
|
192 | (1) |
|
|
193 | (1) |
|
|
194 | (1) |
|
|
194 | (1) |
|
|
195 | (1) |
|
When to Use EventStorming |
|
|
196 | (1) |
|
|
196 | (2) |
|
|
197 | (1) |
|
|
197 | (1) |
|
|
198 | (1) |
|
|
198 | (3) |
|
13 Domain-Driven Design in the Real World |
|
|
201 | (16) |
|
|
202 | (2) |
|
Understand the Business Domain |
|
|
202 | (1) |
|
Explore the Current Design |
|
|
203 | (1) |
|
|
204 | (6) |
|
|
205 | (2) |
|
|
207 | (1) |
|
Cultivate a Ubiquitous Language |
|
|
207 | (3) |
|
Pragmatic Domain-Driven Design |
|
|
210 | (1) |
|
Selling Domain-Driven Design |
|
|
211 | (2) |
|
Undercover Domain-Driven Design |
|
|
211 | (2) |
|
|
213 | (1) |
|
|
214 | (3) |
|
Part IV Relationships to Other Methodologies and Patterns |
|
|
|
|
217 | (16) |
|
|
217 | (1) |
|
|
218 | (7) |
|
Method as a Service: Perfect Microservices? |
|
|
219 | (1) |
|
|
220 | (1) |
|
|
221 | (1) |
|
Microservices as Deep Services |
|
|
222 | (1) |
|
Microservices as Deep Modules |
|
|
223 | (2) |
|
Domain-Driven Design and Microservices' Boundaries |
|
|
225 | (4) |
|
|
225 | (2) |
|
|
227 | (1) |
|
|
228 | (1) |
|
Compressing Microservices' Public Interfaces |
|
|
229 | (2) |
|
|
229 | (1) |
|
|
230 | (1) |
|
|
231 | (1) |
|
|
232 | (1) |
|
15 Event-Driven Architecture |
|
|
233 | (16) |
|
Event-Driven Architecture |
|
|
233 | (1) |
|
|
234 | (7) |
|
Events, Commands, and Messages |
|
|
234 | (1) |
|
|
235 | (1) |
|
|
236 | (5) |
|
Designing Event-Driven Integration |
|
|
241 | (5) |
|
Distributed Big Ball of Mud |
|
|
241 | (1) |
|
|
242 | (1) |
|
|
243 | (1) |
|
|
243 | (1) |
|
Refactoring the Event-Driven Integration |
|
|
243 | (2) |
|
Event-Driven Design Heuristics |
|
|
245 | (1) |
|
|
246 | (1) |
|
|
247 | (2) |
|
|
249 | (18) |
|
Analytical Data Model Versus Transactional Data Model |
|
|
249 | (5) |
|
|
250 | (2) |
|
|
252 | (1) |
|
|
253 | (1) |
|
Analytical Data Management Platforms |
|
|
254 | (5) |
|
|
254 | (3) |
|
|
257 | (1) |
|
Challenges of Data Warehouse and Data Lake Architectures |
|
|
258 | (1) |
|
|
259 | (5) |
|
Decompose Data Around Domains |
|
|
259 | (2) |
|
|
261 | (1) |
|
|
262 | (1) |
|
|
262 | (1) |
|
Combining Data Mesh and Domain-Driven Design |
|
|
263 | (1) |
|
|
264 | (1) |
|
|
265 | (2) |
|
|
267 | (30) |
|
A Applying DDD: A Case Study |
|
|
273 | (16) |
|
B Answers to Exercise Questions |
|
|
289 | (8) |
References |
|
297 | (2) |
Index |
|
299 | |