Определение случаев использования приложения

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ сцСнарии использования вашСго прилоТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Lino CLI. Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΈ использования ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ ΠΈΠ»ΠΈ внСшними систСмами ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, инкапсулируя бизнСс-ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ способствуя Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ. ΠœΡ‹ обсудим Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ чтСния ΠΈ записи с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° CQRS, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² с использованиСм Result Pattern.


ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ CQRS (Command Query Responsibility Segregation) ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΡ… состояниС прилоТСния (Commands), ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния Π΄Π°Π½Π½Ρ‹Ρ… (Queries). Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ позволяСт ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ нСзависимо, ΠΏΠΎΠ²Ρ‹ΡˆΠ°Ρ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ удобство сопровоТдСния систСмы.


Result Pattern ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для стандартизации Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, инкапсулируя ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± успСхС ΠΈΠ»ΠΈ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅, сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. Π­Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… уровнях прилоТСния.


ΠœΡ‹ рассмотрим структуру Ρ„Π°ΠΉΠ»ΠΎΠ² Commands ΠΈ Queries, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Π² Handlers ΠΈ стандартизированный Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Всё это Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· автоматичСскоС созданиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Lino CLI.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π₯отя это ΠΈ Π½Π΅ являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, Lino Π² настоящСС врСмя ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° примСнСния ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° CQRS Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ прилоТСния: с использованиСм ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° Mediator Ρ‡Π΅Ρ€Π΅Π· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ MediatR (ΠΎΡ‚ Π”ΠΆΠΈΠΌΠΌΠΈ Π‘ΠΎΠ³Π°Ρ€Π΄Π°) ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Mediator (ΠΎΡ‚ ΠœΠ°Ρ€Ρ‚ΠΈΠ½Π° ΠžΡ‚Π°ΠΌΠ°Ρ€Π°).

ΠžΠ±Π·ΠΎΡ€ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² использования

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ использования прСдставляСт собой ΠΏΠΎΠ»Π½ΠΎΠ΅ взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ ΠΈΠ»ΠΈ внСшними систСмами ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, описывая ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ бизнСс-сцСнарии. Π’ Lino ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½ Π½Π°:

  • Команда (Command): прСдставляСт Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ состояниС систСмы (созданиС, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈ Ρ‚.Π΄.).
  • Запрос (Query): прСдставляСт Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π±Π΅Π· измСнСния состояния Π΄ΠΎΠΌΠ΅Π½Π°.

Π’Π°ΠΊΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ способствуСт ясности ΠΊΠΎΠ΄Π°, ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ тСстированиС, позволяСт нСзависимо ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния ΠΈ записи, ΠΈ соотвСтствуСт ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ чистой Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°ΠΌ Domain-Driven Design (DDD).

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹

Команда β€” это нСизмСняСмоС сообщСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ для выполнСния дСйствия, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰Π΅Π³ΠΎ состояниС систСмы (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, CreateInvoice, DeactivateUser). Она Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ свойства, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

Π₯арактСристики ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

  • ΠΠ΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ: Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΊΠ°ΠΊ record ΠΈΠ»ΠΈ класс Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с get Π±Π΅Π· ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… сСттСров.
  • Π˜ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ имя: ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ выполняСмоС дСйствиС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, CreateOrder, UpdateCustomerAddress.
  • ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅: содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ поля для выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π±Π΅Π· Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΎΠ±ΡŠΡ‘ΠΌΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….
  • Π˜Π·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Π°Ρ валидация: каТдая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΠΌΠ΅Π΅Ρ‚ свои ΠΏΡ€Π°Π²ΠΈΠ»Π° Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ, гарантируя ΠΊΠΎΠ½ΡΠΈΡΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ (Handler).

Π’Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄

Π’Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π° ΠΈ соотвСтствуСт бизнСс-трСбованиям Π΄ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ. Π’ Lino ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ FluentValidation для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этих ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° ΡˆΠΈΡ€ΠΎΠΊΠΎ примСняСтся Π² .NET ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Fluent API для создания ΠΏΡ€Π°Π²ΠΈΠ».

ΠžΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ

  • NotEmpty, NotNull для ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ.
  • InclusiveBetween для числовых Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹Π΅ суммы, ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅/ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ количСства).
  • MaximumLength ΠΈ MinimumLength для Π΄Π»ΠΈΠ½Ρ‹ строк.
  • RuleForEach для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ элСмСнтов Π² коллСкциях (List<T>).
  • Must для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ» (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄Π°Ρ‚).

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ, связанной с этой ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ. Он оркСстрируСт Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ (IUnitOfWork), Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ сСрвисы ΠΈ ΠΏΡ€ΠΈ нСобходимости Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Π΅ события.

Π¨Π°Π±Π»ΠΎΠ½ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°

  • ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ зависимостСй (Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, внСшниС сСрвисы, UnitOfWork) Ρ‡Π΅Ρ€Π΅Π· Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй.
  • Маппинг ΠΈ созданиС Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… сущностСй, обСспСчивая Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ½ΡΠΈΡΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ.
  • ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ бизнСс-ΠΏΡ€Π°Π²ΠΈΠ» (Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, расчёт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π²Ρ‹Π·ΠΎΠ² Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… событий).
  • Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Ρ‡Π΅Ρ€Π΅Π· IUnitOfWork ΠΈΠ»ΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Ρ‡Π΅Ρ€Π΅Π· Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.
  • Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ успСх ΠΈΠ»ΠΈ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ (Result<T>).

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Result

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ простым DTO, содСрТащим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, API ΠΈΠ»ΠΈ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Ρƒ) для продолТСния Ρ€Π°Π±ΠΎΡ‚Ρ‹. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ созданной ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½Π½ΠΎΠΉ сущности (Id) ΠΈ, Π² случаС ошибки, ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ошибкС.

Для сцСнариСв, Π³Π΄Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Result: абстракция, которая инкапсулируСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌ ΠΈΠ»ΠΈ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ. Π’ .NET часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‚ΠΈΠΏΡ‹ Π²Ρ€ΠΎΠ΄Π΅ Result<T> (ΠΈΠ»ΠΈ ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅:

  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π·Π°Π΄Π°Ρ‚ΡŒ Value ΠΏΡ€ΠΈ успСхС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, простой DTO).
  • Π’ случаС Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ содСрТат стандартизированныС ΠΊΠΎΠ΄Ρ‹ ΠΈΠ»ΠΈ сообщСния (Error), Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ (HTTP-ΠΊΠΎΠ΄Ρ‹, Π΄Π΅Ρ‚Π°Π»ΠΈ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΈ Π΄Ρ€.).
  • ΠžΠ±Π»Π΅Π³Ρ‡Π°ΡŽΡ‚ ΡƒΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок ΠΏΠΎ всСй API, поддСрТивая ΠΊΠΎΠ½ΡΠΈΡΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ слоями.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CLI

Lino ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ всСх Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ², Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

lino command new

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ запросит:

  • БСрвис β€” имя сСрвиса, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ создана ΠΊΠΎΠΌΠ°Π½Π΄Π°.
  • ΠœΠΎΠ΄ΡƒΠ»ΡŒ β€” Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… сСрвисах опрСдСляСт Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.
  • Π‘ΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ β€” связанная домСнная ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ, Π½ΠΎ рСкомСндуСтся).
  • Имя ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ β€” ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ имя ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, CreateOrder).

ПослС подтвСрТдСния Lino автоматичСски создаст Ρ„Π°ΠΉΠ»Ρ‹:

  • CreateOrderCommand.cs
  • CreateOrderCommandValidator.cs
  • CreateOrderCommandHandler.cs
  • CreateOrderCommandResult.cs

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ сгСнСрированной структуры

Рассмотрим ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ CreatePerson. БгСнСрированная структура Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

MyApp/
└── src/
    └── Services/
        └── MyService/
            └── Application/
                β”œβ”€β”€ MyApp.MyService.Application.csproj
                └── UseCases/
                    └── People/
                        β”œβ”€β”€ Commands/
                        β”‚   └── CreatePerson/
                        β”‚       β”œβ”€β”€ CreatePersonCommand.cs
                        β”‚       β”œβ”€β”€ CreatePersonCommandValidator.cs
                        β”‚       β”œβ”€β”€ CreatePersonCommandHandler.cs
                        β”‚       └── CreatePersonCommandResult.cs
                        └── Queries/
                            └── ...

Запросы (Queries)

Запрос прСдставляСт собой Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π±Π΅Π· измСнСния состояния Π΄ΠΎΠΌΠ΅Π½Π°. Запросы Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ для эффСктивного чтСния, возвращая Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ поля Π±Π΅Π· Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ†Π΅Π»Ρ‹Ρ… сущностСй, Ссли это Π½Π΅ трСбуСтся.

Π₯арактСристики запроса

  • ΠΠ΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ β€” ΠΊΠ°ΠΊ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, запрос Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ послС создания.
  • ΠžΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ имя β€” ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, GetCustomerById, ListOrdersByDateRange.
  • Π€ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΈ пагинация β€” ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для выполнСния спСцифичСских запросов (Π΄Π°Ρ‚Ρ‹, статус, страница, сортировка).
  • ΠŸΡ€ΠΎΠ΅ΠΊΡ†ΠΈΡ β€” Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ DTO ΠΈΠ»ΠΈ модСль прСдставлСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ полями, избСгая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΠΎΠ»Π½Ρ‹Ρ… Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π’Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Ρ‹ запросов

Π’Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Ρ‹ запросов ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹, значСния ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠΈ (page, pageSize) ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° бСзопасности (ΠΏΡ€Π°Π²Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…). Они Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ FluentValidation.

ΠžΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ запросов

  • GreaterThanOrEqualTo ΠΈΠ»ΠΈ LessThanOrEqualTo для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² ΠΏΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π°Ρ‚Ρ‹).
  • Length для тСкстовых Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, поиск ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ элСктронной ΠΏΠΎΡ‡Ρ‚Π΅).
  • InclusiveBetween для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, минимальноС/максимальноС количСство элСмСнтов Π½Π° страницС).

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ запросов

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ запроса ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ рСпозиториям ΠΈΠ»ΠΈ контСксту Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΉ, избСгая ΠΏΠΎΠ»Π½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… сущностСй. Π’ Lino рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΈ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ Π²Ρ€ΠΎΠ΄Π΅ .Select() для нСпосрСдствСнного отобраТСния Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ DTO, обСспСчивая ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΈ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ запросов

Π’ Lino Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ запросов всСгда прСдставлСны записями (records) с суффиксом QueryResult. Π­Ρ‚ΠΎ соглашСниС примСняСтся нСзависимо ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΎΡ‚Π²Π΅Ρ‚Π° β€” Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ список элСмСнтов (с ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ ΠΈΠ»ΠΈ Π±Π΅Π· Π½Π΅Ρ‘) ΠΈΠ»ΠΈ ΠΎΠ΄Π½Π° дСтализированная запись.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ запроса Ρ‡Π΅Ρ€Π΅Π· CLI

Подобно ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ, Lino прСдоставляСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

lino query new

ΠœΠ°ΡΡ‚Π΅Ρ€ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ ввСсти:

  • БСрвис β€” БСрвис, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ создан запрос.
  • ΠœΠΎΠ΄ΡƒΠ»ΡŒ β€” ΠŸΡ€ΠΈ нСобходимости, опрСдСляСт Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.
  • Π‘ΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ β€” Π‘ΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ‚, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ относится запрос (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ).
  • Имя запроса β€” НапримСр, GetOrderById ΠΈΠ»ΠΈ ListProductsByCategory.

Lino автоматичСски сгСнСрируСт:

  • GetOrderByIdQuery.cs
  • GetOrderByIdQueryValidator.cs
  • GetOrderByIdQueryHandler.cs
  • GetOrderByIdQueryResult.cs

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ сгСнСрированной структуры для запросов

MyApp/
└── src/
    └── Services/
        └── MyService/
            └── Application/
                β”œβ”€β”€ MyApp.MyService.Application.csproj
                └── UseCases/
                    └── Orders/
                        β”œβ”€β”€ Commands/
                        |   └── ...
                        └── Queries/
                            └── GetOrderById/
                                β”œβ”€β”€ GetOrderByIdQuery.cs
                                β”œβ”€β”€ GetOrderByIdQueryValidator.cs
                                β”œβ”€β”€ GetOrderByIdQueryHandler.cs
                                └── GetOrderByIdQueryResult.cs

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π²Ρ‹ ΠΏΠΎΠΉΠΌΡ‘Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Use Cases (Commands ΠΈ Queries) Π² Lino, Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹Π΅ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ бизнСс-сцСнарии, Ρ‡Ρ‘Ρ‚ΠΊΠΎ раздСляя Π»ΠΎΠ³ΠΈΠΊΡƒ записи ΠΈ чтСния. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ CLI для ускорСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π½ΠΎ всСгда провСряйтС ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² соотвСтствии с особыми трСбованиями вашСго Π΄ΠΎΠΌΠ΅Π½Π°.

Π”Π°Π»Π΅Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с постоянством Π΄Π°Π½Π½Ρ‹Ρ…, событиями Π΄ΠΎΠΌΠ΅Π½Π° ΠΈ инфраструктурными сСрвисами, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ всю Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ вашСго прилоТСния.

Произошла необработанная ошибка. Обновить πŸ—™