Channel: C# 1001 notes
Forwarded from Just Xor
Generic Repository ΡΡΠΎ Π°Π½ΡΠΈΠΏΠ°ΡΡΠ΅ΡΠ½. ΠΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΠΏΡΠ°Π²ΠΈΠ» ΠΊΠ°ΠΊΠΈΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ - ΡΡΠΎ Π²ΡΠ΅ΡΠ΅Π»ΠΎ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ.
ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΡΡ ΠΊΠ»Π°ΡΡ ΠΏΡΠΎΡΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ. Π ΠΊΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ°Π±ΠΎΡΡ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ - ΡΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΎΠΏΡΠ°Π²Π΄Π°Π½ΠΎ.
βͺΠ§ΠΈΡΠ°ΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ
@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠ΅ΠΉ Π² C# β¬
ΠΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π½Π°ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡ Π² Π±Π»ΠΎΠΊΠΈ catch, ΡΡΠΎΠ±Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π΅ Π²ΡΠ²ΠΎΠ΄ΠΈΠ»ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΈΠΏΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ.
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΈΡ Π»ΠΈΡΡ ΠΈΠ·ΡΠ΅Π΄ΠΊΠ°, Π½ΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Ρ ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌ if/else Π²Π½ΡΡΡΠΈ Π±Π»ΠΎΠΊΠ° catch.
@csharp_1001_notes
ΠΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π½Π°ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡ Π² Π±Π»ΠΎΠΊΠΈ catch, ΡΡΠΎΠ±Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π΅ Π²ΡΠ²ΠΎΠ΄ΠΈΠ»ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΈΠΏΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ.
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΈΡ Π»ΠΈΡΡ ΠΈΠ·ΡΠ΅Π΄ΠΊΠ°, Π½ΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Ρ ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌ if/else Π²Π½ΡΡΡΠΈ Π±Π»ΠΎΠΊΠ° catch.
@csharp_1001_notes
ΠΠ»ΠΎΠ³ ΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π΅ Microsoft Office Ρ RTC (Real-Time Channel) Π½Π° ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ .
NET
! ΠΡΠΎ Π±ΡΠ»ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ°ΠΌΡΡ ΠΏΠ΅ΡΠ²ΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
SignalR
Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ!#dotnet #aspnetcore #signalr
https://devblogs.microsoft.com/dotnet/office-rtc-dotnet-migration/
@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
C ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π΅Π»Π΅Π³ΠΈΡΡΡΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠΈΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ:
- ΠΡΠΎΡΠΎΠΊΠΎΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
- Π’ΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠ°
- ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ
- ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ
- ΠΠ²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ
https://dotnet.microsoft.com/en-us/apps/aspnet
@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
ΠΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠΎΠ² C# ΠΈΠ· Π΄Π°Π½Π½ΡΡ
JSON/XML! π€π₯
Π Visual Studio:
1/ Π‘ΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅
2/ Π Visual Studio Π½Π°ΠΆΠΌΠΈΡΠ΅ Π½Π° Edit -> Paste Special -> Paste JSON as classes (ΠΈΠ»ΠΈ XML).
3/ ΠΠΎΡ ΠΈ Π²ΡΠ΅!
@csharp_1001_notes
Π Visual Studio:
1/ Π‘ΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅
JSON/XM
L.2/ Π Visual Studio Π½Π°ΠΆΠΌΠΈΡΠ΅ Π½Π° Edit -> Paste Special -> Paste JSON as classes (ΠΈΠ»ΠΈ XML).
3/ ΠΠΎΡ ΠΈ Π²ΡΠ΅!
@csharp_1001_notes
.NET
, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ Active Directory
ΠΏΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ Active Directory Web Services (ADWS)
.SOAPHound ΡΠ²Π»ΡΠ΅ΡΡΡ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²ΠΎΠΉ ΡΡΠ΄Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Ρ ΠΎΡΠΊΡΡΡΡΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ Active Directory ΡΠ΅ΡΠ΅Π· ΠΏΡΠΎΡΠΎΠΊΠΎΠ» LDAP.
SOAPHound ΡΠΏΠΎΡΠΎΠ±Π΅Π½ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡ ΡΡ ΠΆΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π±Π΅Π· ΠΏΡΡΠΌΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ LDAP.
ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ LDAP-Π·Π°ΠΏΡΠΎΡΡ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡΡΡ Π² ΡΠ΅ΡΠΈΡ SOAP-ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ADWS Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ°Π½Π°Π»Π° ΡΠ²ΡΠ·ΠΈ NET TCP Binding.
ΠΠ°ΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅Ρ ADWS ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅Ρ LDAP-Π·Π°ΠΏΡΠΎΡΡ ΠΈ Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΡ Π½Π° LDAP-ΡΠ΅ΡΠ²Π΅Ρ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ Π½Π° ΡΠΎΠΌ ΠΆΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ΅ Π΄ΠΎΠΌΠ΅Π½Π°.
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ LDAP-ΡΡΠ°ΡΠΈΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ ΠΎΠ±ΡΡΠ½ΡΠΌΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π°.
β’ Github
@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
Π ΠΎΠ±Π»Π°ΡΡΠΈ Π²Π΅Π±-ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Blazor WebAssembly ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π²ΠΎΠ»ΡΡΠΈΠΎΠ½Π½ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ.
ΠΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠ΅ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ
.NET ΠΈ C#, Π° Π½Π΅ JavaScript.
ΠΡΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π½ΠΎΠ²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π»Ρ Π²Π΅Π±-ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, Π½ΠΎ ΠΈ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ Π½ΠΎΠ²ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΈ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ ΡΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
https://www.thetechplatform.com/post/different-methods-to-host-and-deploy-blazor-webassembly
@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
β‘οΈ CI/CD Workflow: ΡΠΏΡΠΎΡΠ΅Π½Π½ΡΠΉ Π³Π°ΠΉΠ΄ ΠΎΡ ByteByteGo
CI/CD β ΡΡΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΠΠ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ½.
ΠΡΠ΄Ρ Π²Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ, ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΎΠΌ ΠΏΠΎ DevOps, ΡΠ΅ΡΡΠΈΡΠΎΠ²ΡΠΈΠΊΠΎΠΌ ΠΈΠ»ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΠ΅ΡΡ Π»ΡΠ±ΠΎΠΉ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΎΠ»ΡΡ Π² ΠΠ’, CI/CD ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ ΡΡΠ°Π»ΠΈ Π½Π΅ΠΎΡΡΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ ΡΠ°ΡΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
@csharp_1001_notes
CI/CD β ΡΡΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΠΠ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ½.
ΠΡΠ΄Ρ Π²Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ, ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΎΠΌ ΠΏΠΎ DevOps, ΡΠ΅ΡΡΠΈΡΠΎΠ²ΡΠΈΠΊΠΎΠΌ ΠΈΠ»ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΠ΅ΡΡ Π»ΡΠ±ΠΎΠΉ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΎΠ»ΡΡ Π² ΠΠ’, CI/CD ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ ΡΡΠ°Π»ΠΈ Π½Π΅ΠΎΡΡΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ ΡΠ°ΡΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
@csharp_1001_notes
βͺΠ§ΠΈΡΠ°ΡΡ
@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
ΠΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠΈΠΊΠΈ Π² EF Core ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°ΡΡ, ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π°Π²Π»ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ EF Core.
ΠΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠΈΠΊΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΡΡΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° DbContext ΠΏΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠΈΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IInterceptor. ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ½Π½ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² Π²ΠΊΠ»ΡΡΠ°ΡΡ
- IDbCommandInterceptor,
- IDbConnectionInterceptor,
- IDbTransactionInterceptor,
- ISaveChangesInterceptor.
ΠΠ°ΠΌ Π½Π΅ Π½ΠΊΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΡΡΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π½Π°ΠΏΡΡΠΌΡΡ.
ΠΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ.
ΠΠΎΡ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠΈΠΊΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠΈΠΊΠ°
SaveChangesInterceptor
, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
.ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π°ΡΠ΄ΠΈΡΠ°
ΠΠ°ΠΏΠΈΡΠΈ Π°ΡΠ΄ΠΈΡΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ - ΡΠ΅Π½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ . ΠΡ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π°ΡΠ΄ΠΈΡΠ° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ. Π’Π°ΠΊΠΆΠ΅ ΡΡΠΎ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Β«Π΄ΠΎΒ» ΠΈ Β«ΠΏΠΎΡΠ»Π΅Β», Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π²Π°ΡΠΈΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IAuditable Ρ Π΄Π°ΡΠ°ΠΌΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°:
public interface IAuditable
{
DateTime Created { get; }
DateTime? Modified { get; }
}
ΠΠΎΠ±Π°Π²ΠΈΠΌ UpdateInterceptor Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π°ΡΠ΄ΠΈΡΠ°. ΠΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ChangeTracker Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° Π²ΡΠ΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² IAuditable ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°. ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ SavingChangesAsync, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π±ΡΠ΄ΡΡ ΡΠΎΡ ΡΠ°Π½Π΅Π½Ρ Π² ΠΠ.
internal sealed class UpdateInterceptor
: SaveChangesInterceptor
{
public override
ValueTask<InterceptionResult<int>>
SavingChangesAsync(
DbContextEventData e,
InterceptionResult<int> result,
CancellationToken ct = default)
{
if (e.Context is not null)
UpdateEntities(e.Context);
return base
.SavingChangesAsync(e, result, ct);
}
private static void
UpdateEntities(DbContext ctx)
{
var now = DateTime.UtcNow;
var entities = ctx
.ChangeTracker
.Entries<IAuditable>()
.ToList();
foreach (var e in entities)
{
if (e.State == EntityState.Added)
e.Property(
nameof(IAuditable.Created)) = now;
if (e.State == EntityState.Modified)
e.Property(
nameof(IAuditable.Modified)) = now;
}
}
}
ΠΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠ°ΡΡΠΈΡΠΈΡΡ, Π²ΠΊΠ»ΡΡΠΈΠ² Π² Π½Π΅Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅.
ΠΠ°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠΈΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
services.AddSingleton<UpdateInterceptor>();
services.AddDbContext<
IApplicationDbContext,
AppDbContext>(
(sp, opts) => opts
.UseSqlServer(connString)
.AddInterceptors(
sp.GetRequiredService<UpdateInterceptor>());
π ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅
@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
ΠΡΠ° ΡΡΠ°ΡΡΡ Π·Π½Π°ΠΊΠΎΠΌΠΈΡ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠ΅ΠΉ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΠΈ ΠΈ Ρ Π°ΠΎΡ-ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠΈΠΈ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ .NET Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Polly ΠΈ ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΎ Π½ΠΎΠ²ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ , ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ρ Π°ΠΎΡ-ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠΈΡ.
Π Π½Π΅ΠΉ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΎ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΉ Ρ Π°ΠΎΡΠ° Π² HTTP-ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, ΠΊΠ°ΠΊ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΡ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΠΈ Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΡΠ°Π±ΠΎΡΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
βͺΠ‘ΡΠ°ΡΡΡ
βͺPolly
@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
Π¨Π°Π±Π»ΠΎΠ½ Π₯ΡΠ°Π½ΠΈΡΠ΅Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π°:
βͺΠ½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΡΠ½ΠΈΠΌΠΎΠΊ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° (ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΡΠ°ΡΡΠΈ) Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ
βͺΠΏΡΡΠΌΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠ°ΡΠΊΡΡΠ²Π°Π΅Ρ Π΄Π΅ΡΠ°Π»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ Π½Π°ΡΡΡΠ°Π΅Ρ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΡΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
Π C# ΠΏΠ°ΡΡΠ΅ΡΠ½ Memento ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ ΡΡΠ΅Ρ ΠΊΠ»Π°ΡΡΠΎΠ²:
Originator, Memento ΠΈ Caretaker.
βͺ ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅
@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
EF 8 Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ Π±ΠΎΠ΄Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ
Π Π°Π·Π½ΠΈΡΡ Π² Π·Π°ΠΏΡΠΎΡΠ°Ρ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π½Π° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ΅.
@csharp_1001_notes
IN
Π²ΠΌΠ΅ΡΡΠΎ EXISTS
, ΠΊΠΎΠ³Π΄Π° ΠΌΠ΅ΡΠΎΠ΄ Contains
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡΠΎΠΌ.Π Π°Π·Π½ΠΈΡΡ Π² Π·Π°ΠΏΡΠΎΡΠ°Ρ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π½Π° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ΅.
@csharp_1001_notes
βͺΠ§Π°ΡΡΡ 1
βͺΠ§Π°ΡΡΡ2
@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
System.IO.Hashing - ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ
πΠ£Π·Π½Π°ΡΡ ΠΎ Π½Π΅ΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅
@csharp_1001_notes
NuGet
Π΄Π»Ρ Π½Π΅ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Ρ
ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² .NET
.πΠ£Π·Π½Π°ΡΡ ΠΎ Π½Π΅ΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅
@csharp_1001_notes
β‘οΈ AspNetCore.ApiGateway
ΠΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΊΡΡΡΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ: ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ Ρ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠΎΠ² #ASPNETCore.
ΠΠ΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ ΠΎΡ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° #ASPNETCore ΠΊ Veritas API Gateway, Π² ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ ΠΎΠ΄ΡΡ, Swagger, ΠΌΠ΅ΡΠΎΠ΄Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ, ΡΠΈΠ»ΡΡΡΡ, Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅.
βͺ Github
@csharp_1001_notes
ΠΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΊΡΡΡΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ: ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ Ρ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠΎΠ² #ASPNETCore.
ΠΠ΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ ΠΎΡ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° #ASPNETCore ΠΊ Veritas API Gateway, Π² ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ ΠΎΠ΄ΡΡ, Swagger, ΠΌΠ΅ΡΠΎΠ΄Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ, ΡΠΈΠ»ΡΡΡΡ, Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅.
βͺ Github
@csharp_1001_notes
β‘οΈ ΠΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½Π°Ρ ΠΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ Π² MediatR
MediatR β ΡΡΠΎ ΠΏΠΎΠΏΡΠ»ΡΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° ΠΏΠΎΡΡΠ΅Π΄Π½ΠΈΠΊ Π² .NET.
Π‘ ΡΠΎΡΡΠΎΠΌ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡΠΈ ΠΏΠ°ΡΡΠ΅ΡΠ½Π°
ΠΠ·Π΄Π°ΡΠ΅Π»Ρ β ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊ β ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Π±Π»ΠΎΠ½ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅ ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΠΌΠΈ (Π°Π½Π³Π». publishers), Π½Π°ΠΏΡΡΠΌΡΡ Π½Π΅ ΠΏΡΠΈΠ²ΡΠ·Π°Π½Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΊ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠ°ΠΌ (Π°Π½Π³Π». subscribers).
ΠΠΎ ΠΎΠ½Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΈΠ·Π΄Π°ΡΠ΅Π»Ρ-ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ. ΠΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ INotification, ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠΎΠ² ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
Π Π°Π·Π±Π΅ΡΠ΅ΠΌΡΡ ΠΊΠ°ΠΊ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ.
ΠΠ°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΊΠ»Π°ΡΡ, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠΉ INotification:
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ - ForeachAwaitPublisher:
ΠΠΎ Π²Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ TaskWhenAllPublisher (ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΠ»ΠΈΡΠΈΡ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° Publish:
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ AddMediatR.
ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ TaskWhenAllPublisher, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅:
- ΡΠΊΠ°Π·Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ²ΠΎΠΉΡΡΠ²Π° NotificationPublisher (ΡΠΎΠ³Π΄Π° ΠΈΠ·Π΄Π°ΡΠ΅Π»Ρ Π±ΡΠ΄Π΅Ρ ΡΠΈΠ½Π³Π»ΡΠΎΠ½ΠΎΠΌ),
- ΡΠΊΠ°Π·Π°ΡΡ ΡΠΈΠΏ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ Π² ΡΠ²ΠΎΠΉΡΡΠ²Π΅ NotificationPublisherType ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ServiceLifetime Π΄Π»Ρ Π·Π°Π΄Π°Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ:
ΠΠ»ΡΡΡ
ΠΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.
ΠΠ΄Π½Π°ΠΊΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π²ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΠΎΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ. ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠΎΠ»ΠΊΠ½ΡΡΡΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ°ΠΊΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ EF Core DbContext.
π ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅
@csharp_1001_notes
MediatR β ΡΡΠΎ ΠΏΠΎΠΏΡΠ»ΡΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° ΠΏΠΎΡΡΠ΅Π΄Π½ΠΈΠΊ Π² .NET.
ΠΠΎΡΡΠ΅Π΄Π½ΠΈΠΊ
β ΠΏΠ°ΡΡΠ΅ΡΠ½ ΡΠ°Π±Π»ΠΎΠ½ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠΈΠΉ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΡΠΎΡΠΌΠΈΡΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠ»Π°Π±ΠΎΠ΅ Π·Π°ΡΠ΅ΠΏΠ»Π΅Π½ΠΈΠ΅ ΠΈ ΠΈΠ·Π±Π°Π²Π»ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΎΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠ²Π½ΠΎ ΡΡΡΠ»Π°ΡΡΡΡ Π΄ΡΡΠ³ Π½Π° Π΄ΡΡΠ³Π°.Π‘ ΡΠΎΡΡΠΎΠΌ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡΠΈ ΠΏΠ°ΡΡΠ΅ΡΠ½Π°
CQRS MediatR
ΡΡΠ°Π»Π° ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ Π·Π°ΠΏΡΠΎΡΠΎΠ².ΠΠ·Π΄Π°ΡΠ΅Π»Ρ β ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊ β ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Π±Π»ΠΎΠ½ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅ ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΠΌΠΈ (Π°Π½Π³Π». publishers), Π½Π°ΠΏΡΡΠΌΡΡ Π½Π΅ ΠΏΡΠΈΠ²ΡΠ·Π°Π½Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΊ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠ°ΠΌ (Π°Π½Π³Π». subscribers).
ΠΠΎ ΠΎΠ½Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΈΠ·Π΄Π°ΡΠ΅Π»Ρ-ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ. ΠΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ INotification, ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠΎΠ² ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
Π Π°Π·Π±Π΅ΡΠ΅ΠΌΡΡ ΠΊΠ°ΠΊ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ.
ΠΠ°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΊΠ»Π°ΡΡ, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠΉ INotification:
public record OrderCreated(Guid OrderId) : INotification;
Π ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ INotificationHandler:
public class OrderCreatedHandler :
INotificationHandler<OrderCreated>
{
private readonly INotificationService svc;
public OrderCreatedHandler(
INotificationService service)
{
svc = service;
}
public async Task Handle(
OrderCreated notification,
CancellationToken ct)
{
await svc.SendOrderCreatedEmail(
notification.OrderId,
ct);
}
}
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ IMediator ΠΈΠ»ΠΈ IPublisher:
await publisher.Publish(
new OrderCreated(order.Id),
cancellationToken);
MediatR Π²ΡΠ·ΠΎΠ²Π΅Ρ Π²ΡΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ. ΠΠΎ 12ΠΉ Π²Π΅ΡΡΠΈΠΈ MediatR ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Π²ΡΠ·ΡΠ²Π°Π»Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΏΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ INotificationPublisher, ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ - ForeachAwaitPublisher:
public class ForeachAwaitPublisher
: INotificationPublisher
{
public async Task Publish(
IEnumerable<NotificationHandlerExecutor> executors,
INotification notification,
CancellationToken ct)
{
foreach (var e in executors)
{
await e
.HandlerCallback(notification, ct)
.ConfigureAwait(false);
}
}
}
ΠΠ½Π° Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ ΠΏΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ².
ΠΠΎ Π²Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ TaskWhenAllPublisher (ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΠ»ΠΈΡΠΈΡ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° Publish:
var tasks = executors
.Select(e =>
e.HandlerCallback(notification, ct))
.ToArray();
return Task.WhenAll(tasks);
TaskWhenAllPublisher Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π²ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΈΡ Π²ΡΠ΅ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΈ Π»ΠΈ Π² Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΡΠ»ΠΈ Π²Ρ ΡΠΎΡ ΡΠ°Π½ΠΈΡΠ΅ Π·Π°Π΄Π°ΡΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½Π½ΡΡ TaskWhenAllPublisher, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ²ΠΎΠΉΡΡΠ²Ρ Task.Exception, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅ΠΌΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ AggregateException, ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ AddMediatR.
ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ TaskWhenAllPublisher, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅:
- ΡΠΊΠ°Π·Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ²ΠΎΠΉΡΡΠ²Π° NotificationPublisher (ΡΠΎΠ³Π΄Π° ΠΈΠ·Π΄Π°ΡΠ΅Π»Ρ Π±ΡΠ΄Π΅Ρ ΡΠΈΠ½Π³Π»ΡΠΎΠ½ΠΎΠΌ),
- ΡΠΊΠ°Π·Π°ΡΡ ΡΠΈΠΏ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ Π² ΡΠ²ΠΎΠΉΡΡΠ²Π΅ NotificationPublisherType ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ServiceLifetime Π΄Π»Ρ Π·Π°Π΄Π°Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ:
services.AddMediatR(cfg => {
β¦
cfg.NotificationPublisher =
new TaskWhenAllPublisher();
// ΠΈΠ»ΠΈ
cfg.NotificationPublisherType =
typeof(TaskWhenAllPublisher);
cfg.ServiceLifetime = ServiceLifetime.Transient;
});
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ INotificationPublisher ΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ.
ΠΠ»ΡΡΡ
ΠΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.
ΠΠ΄Π½Π°ΠΊΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π²ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΠΎΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ. ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠΎΠ»ΠΊΠ½ΡΡΡΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ°ΠΊΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ EF Core DbContext.
π ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅
@csharp_1001_notes
β‘οΈ ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°ΡΡ ΠΎ ΡΠ΅ΡΡΠΎΠ²ΡΡ
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°Ρ
. ΠΡΠΎ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΡ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π²Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ.
ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ TestcontainersΠ½Π° .NET:
https://testcontainers.com/guides/getting-started-with-testcontainers-for-dotnet/
#dotnet #csharp #fsharp
@csharp_1001_notes
ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ TestcontainersΠ½Π° .NET:
https://testcontainers.com/guides/getting-started-with-testcontainers-for-dotnet/
#dotnet #csharp #fsharp
@csharp_1001_notes
π Text2sql
ΠΠ΅ΠΉΡΠΎΡΠ΅ΡΡ, ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΠ°ΡΡΡ Π½Π° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ SQL-Π·Π°ΠΏΡΠΎΡΠΎΠ² (ΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ) ΠΏΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅:
ΠΡΠ²Π΅Ρ Π½Π΅ΠΉΡΠΎΡΠ΅ΡΠΈ:
π text2sql.ai
@csharp_1001_notes
ΠΠ΅ΠΉΡΠΎΡΠ΅ΡΡ, ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΠ°ΡΡΡ Π½Π° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ SQL-Π·Π°ΠΏΡΠΎΡΠΎΠ² (ΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ) ΠΏΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅:
A Regex expression to match a password that contains at least one lowercase letter, one uppercase letter, one digit, one special character, and is at least 8 characters long
ΠΡΠ²Π΅Ρ Π½Π΅ΠΉΡΠΎΡΠ΅ΡΠΈ:
^(?=.*d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{":;'/?.><,])(?=.*[^s]).{8,}$
π text2sql.ai
@csharp_1001_notes
aspire dashboard
, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΌ ΠΊΠ°ΠΊ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ.https://learn.microsoft.com/en-us/samples/dotnet/aspire-samples/aspire-standalone-dashboard/
@csharp_1001_notes
Please open Telegram to view this post
VIEW IN TELEGRAM
HTML Embed Code: