alexey merson gmail com 2 3
play

alexey.merson@gmail.com 2 - PowerPoint PPT Presentation

Domain Driven Design: alexey.merson@gmail.com 2 3 4 5 6 7 8 DDD 9 Domain Driven Design:


  1. Domain Driven Design: рецепт для прагматика Алексей Мерсон alexey.merson@gmail.com

  2. 2

  3. 3

  4. 4

  5. 5

  6. 6

  7. 7

  8. 8

  9. DDD 9

  10. Domain Driven Design: Стратегическое Взаимодействие между проектирование людьми Борьба со сложностью Подходы к архитектуре Тактические паттерны 10

  11. 11

  12. 12

  13. 13

  14. 14

  15. 15

  16. Ключевые идеи стратегического проектирования 16

  17. Доменные эксперты 17

  18. Доменные эксперты Технические специалисты 18

  19. Доменные эксперты Технические специалисты 19

  20. Доменные эксперты Технические специалисты 20

  21. Общение между участниками проекта формирует ubiquitous la language 21

  22. Сценарий: Докладчик регистрируется на событие и добавляет информацию о докладе 22

  23. Domain model Speaker Talk Event 23

  24. Доменная модель и ubiquitous language ограничены контекстом (bounded context) 24

  25. Event planning context Domain model Speaker Talk Event 25

  26. Event planning Identity context context User Speaker Role Talk Profile Event 26

  27. Event planning Identity context context User Speaker Role Talk Profile Event 27

  28. Sales service 28

  29. Сценарий: По нажатию на Checkout считается окончательная цена заказа с учетом скидки постоянного клиента, и заказ переходит в статус «Ожидание оплаты» 29

  30. public void Checkout(long id) { var ord = _ordersRepository.GetOrder(id); var orders = _ordersRepository.GetOrders().Count( o => o.CustomerId == ord.CustomerId && o.StateId == 3 && o.OrderDate >= DateTime.UtcNow.AddYears(-5)); ord.Price *= (100 - (orders >= 5 ? 30m : orders >= 3 ? 20m : orders >= 1 ? 10m : 0)) / 100; ord.StateId = 1; _ordersRepository.SaveOrder(ord); } https://github.com/a-merson/Stachka2019 30

  31. public void Checkout(long id) { var ord = _ordersRepository.GetOrder(id); var orders = _ordersRepository.GetOrders().Count( o => o.CustomerId == ord.CustomerId && o.StateId == 3 && o.OrderDate >= DateTime.UtcNow.AddYears(-5)); ord.Price *= (100 - (orders >= 5 ? 30m : orders >= 3 ? 20m : orders >= 1 ? 10m : 0)) / 100; ord.StateId = 1; _ordersRepository.SaveOrder(ord); } https://github.com/a-merson/Stachka2019 31

  32. public void Checkout(long id) { var ord = _ordersRepository.GetOrder(id); var orders = _ordersRepository.GetOrders().Count( o => o.CustomerId == ord.CustomerId && o.StateId == 3 && o.OrderDate >= DateTime.UtcNow.AddYears(-5)); ord.Price *= (100 - (orders >= 5 ? 30m : orders >= 3 ? 20m : orders >= 1 ? 10m : 0)) / 100; ord.StateId = 1; _ordersRepository.SaveOrder(ord); } https://github.com/a-merson/Stachka2019 32

  33. public void Checkout(long id) { var ord = _ordersRepository.GetOrder(id); var orders = _ordersRepository.GetOrders().Count( o => o.CustomerId == ord.CustomerId && o.StateId == 3 && o.OrderDate >= DateTime.UtcNow.AddYears(-5)); ord.Price *= (100 - (orders >= 5 ? 30m : orders >= 3 ? 20m : orders >= 1 ? 10m : 0)) / 100; ord.StateId = 1; _ordersRepository.SaveOrder(ord); } https://github.com/a-merson/Stachka2019 33

  34. public void Checkout(long id) { var ord = _ordersRepository.GetOrder(id); var orders = _ordersRepository.GetOrders().Count( o => o.CustomerId == ord.CustomerId && o.StateId == 3 && o.OrderDate >= DateTime.UtcNow.AddYears(-5)); ord.Price *= (100 - (orders >= 5 ? 30m : orders >= 3 ? 20m : orders >= 1 ? 10m : 0)) / 100; ord.StateId = 1; _ordersRepository.SaveOrder(ord); } https://github.com/a-merson/Stachka2019 34

  35. public void Checkout(long id) { var ord = _ordersRepository.GetOrder(id); var orders = _ordersRepository.GetOrders().Count( o => o.CustomerId == ord.CustomerId && o.StateId == 3 && o.OrderDate >= DateTime.UtcNow.AddYears(-5)); ord.Price *= (100 - (orders >= 5 ? 30m : orders >= 3 ? 20m : orders >= 1 ? 10m : 0)) / 100; ord.StateId = 1; _ordersRepository.SaveOrder(ord); } https://github.com/a-merson/Stachka2019 35

  36. 36

  37. public void CheckoutV2(long orderId) { var order = _ordersRepository.GetOrder(orderId); var discount = _ с alculator.CalculateDiscountBy(order.CustomerId); order.ApplyDiscount(discount); order.State = OrderState. AwaitingPayment ; _ordersRepository.SaveOrder(order); } https://github.com/a-merson/Stachka2019 37

  38. public void CheckoutV2(long orderId) { var order = _ordersRepository.GetOrder(orderId); var discount = _ с alculator.CalculateDiscountBy(order.CustomerId); order.ApplyDiscount(discount); order.State = OrderState. AwaitingPayment ; _ordersRepository.SaveOrder(order); } https://github.com/a-merson/Stachka2019 38

  39. public void CheckoutV2(long orderId) { var order = _ordersRepository.GetOrder(orderId); var discount = _ с alculator.CalculateDiscountBy(order.CustomerId); order.ApplyDiscount(discount); order.State = OrderState. AwaitingPayment ; _ordersRepository.SaveOrder(order); } https://github.com/a-merson/Stachka2019 39

  40. public void CheckoutV2(long orderId) { var order = _ordersRepository.GetOrder(orderId); var discount = _ с alculator.CalculateDiscountBy(order.CustomerId); order.ApplyDiscount(discount); order.State = OrderState. AwaitingPayment ; _ordersRepository.SaveOrder(order); } https://github.com/a-merson/Stachka2019 40

  41. public void CheckoutV2(long orderId) { var order = _ordersRepository.GetOrder(orderId); var discount = _ с alculator.CalculateDiscountBy(order.CustomerId); order.ApplyDiscount(discount); order.State = OrderState. AwaitingPayment ; _ordersRepository.SaveOrder(order); } https://github.com/a-merson/Stachka2019 41

  42. public void CheckoutV2(long orderId) { var order = _ordersRepository.GetOrder(orderId); var discount = _ с alculator.CalculateDiscountBy(order.CustomerId); order.ApplyDiscount(discount); order.State = OrderState. AwaitingPayment ; _ordersRepository.SaveOrder(order); } https://github.com/a-merson/Stachka2019 42

  43. public decimal CalculateDiscountBy(long customerId) { var completedOrdersCount = _ordersRepository .GetLast5YearsCompletedOrdersCountFor(customerId); return DiscountBy(completedOrdersCount); } https://github.com/a-merson/Stachka2019 44

  44. private decimal DiscountBy(int completedOrdersCount) { if (completedOrdersCount >= 5) return 30; if (completedOrdersCount >= 3) return 20; if (completedOrdersCount >= 1) return 10; return 0; } https://github.com/a-merson/Stachka2019 45

  45. public void CheckoutV2(long orderId) { var order = _ordersRepository.GetOrder(orderId); var discount = _ с alculator.CalculateDiscountBy(order.CustomerId); order.ApplyDiscount(discount); order.State = OrderState. AwaitingPayment ; _ordersRepository.SaveOrder(order); } https://github.com/a-merson/Stachka2019 46

  46. Доменная модель и бизнес - логика должны использовать ubiquitous language 47

  47. Domain Subdomain Bounded Subdomain context Bounded context Bounded context Subdomain 48

  48. Domain Subdomain Bounded Subdomain context Bounded context Bounded context Subdomain 49

  49. Domain Subdomain Bounded Subdomain context Bounded context Bounded context Subdomain 50

  50. Subdomains Core Supporting Generic 51

  51. Subdomains Core Supporting Generic 52

  52. Subdomains Core Supporting Generic Контент 53

  53. Subdomains Core Supporting Generic 54

  54. Subdomains Core Supporting Generic Маркетинг 55

  55. Subdomains Core Supporting Generic 56

  56. Subdomains Core Supporting Generic Оплата 57

  57. Domain Subdomain Bounded Subdomain context Bounded context Bounded context Subdomain 58

  58. Задачи бизнеса Программные решения Bounded Subdomain context 59

  59. Бухгалтерия Программные решения 60

  60. Яндекс Билеты Касса Custom Контент application 61

  61. Архитектура и управление зависимостями 62

  62. Micro services Domain Driven CQRS Layers Design Event- Driven 63

  63. Цель: максимально избавить доменную логику от зависимостей 64

  64. Presentation layer Business layer Data layer 65

  65. Presentation layer Application layer Domain layer Infrastructure layer 66

  66. UI & Infrastructure Application layer Domain layer 67

  67. UI & Infrastructure Application layer Domain layer 68

  68. UI & Infrastructure Application layer Domain layer 69

Recommend


More recommend