Skip to content
Π“Π»Π°Π²Ρ‹

πŸ’Ύ Data Access Layer ​

Π‘Π»ΠΎΠΉ взаимодСйствия с внСшними Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΡ‹ Π² дальнСйшСм Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ DAL (Data Access Layer).

Π”Π°Π½Π½Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ позаимствован ΠΈΠ· ΠΌΠΈΡ€Π° сСрвСрной Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (Ссли Π΅Ρ‰Π΅ Ρ‚ΠΎΡ‡Π½Π΅Π΅ β€” ΠΈΠ· .NET). Однако вСсьма ΡƒΠ΄Π°Ρ‡Π½ΠΎ описываСт Ρ€ΠΎΠ»ΡŒ этого слоя прилоТСния.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… β€” Π²Π΅Ρ‰ΡŒ измСнчивая.

ВсСм Π·Π½Π°ΠΊΠΎΠΌΠ° ситуация, ΠΊΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ Π½Π° Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ°Ρ… Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² ΠΆΠΈΠ²ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ мСняСтся Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ эндпоинтов HTTP-API, Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ источники Π΄Π°Π½Π½Ρ‹Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ HTTP-API появляСтся socket.io соСдинСниС ΠΈΠ»ΠΈ стороннСС HTTP-API) ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

ΠŸΡ€ΠΈ этом Ρ‚ΠΈΠΏΡ‹ основных сущностСй, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ большСй ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π΅ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠΉ области.

Наша главная Π·Π°Π΄Π°Ρ‡Π° β€” минимизация числа ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ потрСбуСтся внСсти ΠΏΡ€ΠΈ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ измСнСниях Π²Π½Π΅ΡˆΠ½ΠΈΡ… источников Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΈΡ… интСрфСйсов.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ всС знания ΠΎΠ± источниках Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΡ… интСрфСйсах инкапсулируСт DAL.

Для внСшнСго прилоТСния ΠΎΠ½ прСдоставляСт ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ΅ API для получСния ΠΈ ΠΌΡƒΡ‚Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (коллСкция эффСктов ΠΈ эвСнтов).

Π‘Π°ΠΌΠΎΠ΅ Π²Π°ΠΆΠ½ΠΎΠ΅ здСсь Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ внСшнСС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΎΡ‚ΠΊΡƒΠ΄Π° эти Π΄Π°Π½Π½Ρ‹Π΅ приходят. ИмСнно поэтому ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π² дСмонстрационном ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π°Π·Π²Π°Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ "dal", Π° Π½Π΅ "rest-api" ΠΈΠ»ΠΈ "http".

DAL ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ сСбя состояниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ нСпосрСдствСнно относится ΠΊ Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ источнику Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, JWT access token.

Рассмотрим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ слоя DAL ΠΈ Π΅Π³ΠΎ взаимодСйствиС с ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° нашСм Π΄Π΅ΠΌΠΎ-ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Π’ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ dal/request находится модСль:

  1. Π‘Ρ‚ΠΎΡ€ $accessToken.
  2. Бобытия для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ состояния Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ initAuthState, resetAuthState.
  3. Бобытия для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ измСнСния Ρ‚ΠΎΠΊΠ΅Π½Π° authenticate ΠΈ tokenChanged (Π½Π° случай Ссли Π½Π°ΠΌ понадобится ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π΅Ρ„Ρ€Π΅ΡˆΠ° Ρ‚ΠΎΠΊΠ΅Π½Π°).
  4. Π­Ρ„Ρ„Π΅ΠΊΡ‚Ρ‹-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ Π½Π°Π΄ http-запросами requestFx ΠΈ authRequestFx.

Вся основная Π»ΠΎΠ³ΠΈΠΊΠ° располоТСна Π² init.ts Π—Π΄Π΅ΡΡŒ связываСтся стор $accessToken с эвСнтами Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, прСдоставляСтся имплСмСнтация для requestFx ΠΈ authRequestFx, Π° Ρ‚Π°ΠΊΠΆΠ΅ обСспСчиваСтся сохранСниС ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½Π° ΠΈΠ· localStorage.

Π­Ρ„Ρ„Π΅ΠΊΡ‚Ρ‹ с внСшним API, ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ http-эндпоинты, находятся Π² ΠΊΠΎΡ€Π½Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² Ρ„Π°ΠΉΠ»Π°Ρ… auth.ts ΠΈ products.ts.

Для ΠΌΠ°ΠΏΠΏΠΈΠ½Π³Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² запроса ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ attachWrapper ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ @42px/effector-extra.

Π’ΡƒΡ‚ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° forward Π² auth.ts:

typescript
forward({
  from: signInReqFx.doneData.map(({ token }) => token),
  to: authenticate,
})

Π­Ρ‚ΠΎΡ‚ forward автоматичСски установит $accessToken ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Ρ€Π΅Π·ΠΎΠ»Π²Π΅ эффСкта signInFx. Π’Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ± этом Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ.

Upd 12.11.23 Π’ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ вСрсии effector (v22) рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ sample вмСсто forward.
https://effector.dev/docs/api/effector/sample

ВсС Ρ‡Ρ‚ΠΎ остаСтся Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ:

  1. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ состояниС Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° инициализируСтся само ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ происходит Π² features/app/model/init.ts.
  2. Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эффСкты для получСния/ΠΌΡƒΡ‚Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΊ Π½ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ sign-in.

Данная схСма являСтся лишь ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ…. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π°Ρ рСализация внутрСнностСй слоя DAL ΠΈ Π΅Π³ΠΎ API зависит ΠΎΡ‚ Π·Π°Π΄Π°Ρ‡ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ прилоТСния, Π΅Π³ΠΎ источников Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ способов Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Помимо ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для получСния ΠΈ ΠΌΡƒΡ‚Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, слой DAL Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Ρ‚ΠΈΠΏΡ‹ основных сущностСй (Π² Π΄Π΅ΠΌΠΎ-ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это src/dal/entities.ts) ΠΈ ΠΌΠΎΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… для тСстирования.

ΠŸΠΎΠ΄Ρ‹Ρ‚ΠΎΠΆΠΈΠΌ:

Π‘Π»ΠΎΠΉ DAL прСдоставляСт Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ, Π½Π΅ Π·Π°Π²ΠΈΡΡΡ‰ΡƒΡŽ ΠΎΡ‚ источников Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΡ… интСрфСйсов API для получСния ΠΈ ΠΌΡƒΡ‚Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚ΠΈΠΏΡ‹ основных сущностСй ΠΈ ΠΌΠΎΠΊΠΈ.

42px Company