ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ°ΡΠΏΠΈΡΡΠ° | C#, F#, .NET, ASP.NET
ΠΡΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Π΄Π»Ρ C#-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ°Π½Π°Π»Π΅. ΠΠ°ΡΠΈ ΠΊΡΡΡΡ: https://clc.to/y3LDtw ΠΠΎ ΡΠ΅ΠΊΠ»Π°ΠΌΠ΅: @tproger_sales_bot ΠΠ»Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠ²ΡΠ·ΠΈ: @proglibrary_feeedback_bot Π ΠΠ: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Show moreπ Analytical overview of Telegram channel ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ°ΡΠΏΠΈΡΡΠ° | C#, F#, .NET, ASP.NET
Channel ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ°ΡΠΏΠΈΡΡΠ° | C#, F#, .NET, ASP.NET (@csharpproglib) in the Russian language segment is an active participant. Currently, the community unites 21 562 subscribers, ranking 6 153 in the Technologies & Applications category and 30 464 in the Russia region.
π Audience metrics and dynamics
Since its creation on Π½Π΅Π²ΡΠ΄ΠΎΠΌΠΎ, the project has demonstrated rapid growth, gathering an audience of 21 562 subscribers.
According to the latest data from 26 October, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -105 over the last 30 days and by -8 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 14.32%. Within the first 24 hours after publication, content typically collects 7.43% reactions from the total number of subscribers.
- Post reach: On average, each post receives 3 087 views. Within the first day, a publication typically gains 1 603 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 4.
- Thematic interests: Content is focused on key topics such as .net, ΡΠ°ΡΠΏΠΈΡΡΠ°, Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ, await, string.
π Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
βΠΡΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Π΄Π»Ρ C#-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ°Π½Π°Π»Π΅.
ΠΠ°ΡΠΈ ΠΊΡΡΡΡ: https://clc.to/y3LDtw
ΠΠΎ ΡΠ΅ΠΊΠ»Π°ΠΌΠ΅: @tproger_sales_bot
ΠΠ»Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠ²ΡΠ·ΠΈ: @proglibrary_feeedback_bot
Π ΠΠ: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7feadβ
Thanks to the high frequency of updates (latest data received on 27 October, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
14-Π»Π΅Ρ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅. ΠΠ°Π½ΠΈΠΌΠ°Π΅ΡΡΡ AI-Π°Π΄ΠΎΠΏΡΠ΅Π½ΠΎΠΌ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Yandex Cloud, ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡ ΠΌΠ°ΡΡΠ΅Ρ-ΠΊΠ»Π°ΡΡΡ ΠΈ ΠΏΡΠΎΠ΄Π²ΠΈΠ³Π°Π΅Ρ Π»ΡΡΡΠΈΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ².π£ Π’Π΅Ρ Π»ΠΈΠ΄ Sourcecraft Code Assistant
Π‘ ΡΠΈΠ»ΡΠ½ΡΠΌ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΌ Π±ΡΠΊΠ³ΡΠ°ΡΠ½Π΄ΠΎΠΌ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π» ΡΡΠ°ΡΡΠΈΠ΅ ΠΊΠ°ΠΊ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π»ΠΈΠ΄ Π² ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΌΠΎΡΠ½ΠΎΠ³ΠΎ AI-ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ Π΄Π»Ρ VS Code.π£ Π‘ΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ Open Source
Π Π°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΡΠΈΠ»ΠΈΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π±ΡΡΡΡΠΎ Π½Π°ΡΠ°ΡΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΡ Ρ ΠΈΠ½ΡΠ΅ΡΠ΅Π½ΡΠΎΠΌ ΠΈ Π°Π³Π΅Π½ΡΠ°ΠΌΠΈ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π°Π±ΠΎΡ ΡΠΊΡΠΈΠΏΡΠΎΠ² vllm-setup Π΄Π»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΠΈ mini-proxy β ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡΠΈΡΠ½ΡΠΉ ΠΏΡΠΎΠΊΡΠΈ Π΄Π»Ρ OpenAI API ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ².π£ ΠΠ²ΡΠΎΡ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΡ ML-Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΉ
ΠΠ±ΡΡΡΠ½ΡΠ΅Ρ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ Π½Π°Π³Π»ΡΠ΄Π½ΠΎ. Π‘ΠΎΠ·Π΄Π°Π» ΡΠ΅ΡΠΈΡ Π·Π°Π»ΠΈΠΏΠ°ΡΠ΅Π»ΡΠ½ΡΡ ΠΎΠ±ΡΡΠ°ΡΡΠΈΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΎΠ², Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΆΠΈΠ²ΡΡ ΠΏΠΎΡΡΠΏΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΠ΅ΠΉ Π₯ΠΎΠΏΡΠΈΠ»Π΄Π°, ΠΌΠ°ΡΠΈΠ½ ΠΠΎΠ»ΡΡΠΌΠ°Π½Π° ΠΈ VC-ΡΠ°Π·ΠΌΠ΅ΡΠ½ΠΎΡΡΠΈ.Π ΠΎΠΌΠ°Π½ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎ Π΄Π΅Π»ΠΈΡΡΡ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠ½ΡΠΌΠΈ Π½Π°ΡΠ°Π±ΠΎΡΠΊΠ°ΠΌΠΈ, ΠΈΠ½ΡΠ°ΠΉΡΠ°ΠΌΠΈ ΠΈ ΡΠΊΡΠΏΠ΅ΡΡΠΈΠ·ΠΎΠΉ Π² ΡΠ²ΠΎΠ΅ΠΌ Π°Π²ΡΠΎΡΡΠΊΠΎΠΌ Telegram-ΠΊΠ°Π½Π°Π»Π΅ ΠΠ° ΠΊΡΡΡΠ΅ Π ΠΎΠΌΠ°Π½ Π²ΡΡΡΡΠΏΠ°Π΅Ρ ΠΊΠΎΠ½ΡΡΠ»ΡΡΠ°Π½ΡΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ: ΠΎΠ½ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅ ΡΡΠΎΠΊΠΎΠ² Ρ ΠΎΠΏΠΎΡΠΎΠΉ Π½Π° Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠ½ΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ ΠΈ ΠΆΠ΅ΡΡΠΊΠΈΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ½Π΄ΡΡΡΡΠΈΠΈ. Π£Π·Π½Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌ: π ΠΡΡΡ Β«Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΠ-Π°Π³Π΅Π½ΡΠΎΠ²Β» Π’Π°ΠΊ, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π·Π½Π°ΠΊΠΎΠΌΠΈΡΡ Π²Π°Ρ Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ? π β ΠΠ°, ΠΆΠ΄Π΅ΠΌ Π½ΠΎΠ²ΡΡ Π»ΠΈΡ π₯ β ΠΠ΄Ρ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ ΠΎΡ Π ΠΎΠΌΠ°Π½Π°
users.Add(4);Π²Π΅ΡΡΠΈΡ ΡΠΏΠΈΡΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ. β‘οΈ ΠΡΠΈ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²Π΅ MoveNext() Enumerator ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ Π±ΡΠ»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° ΠΏΠΎΡΠ»Π΅ Π½Π°ΡΠ°Π»Π° ΠΎΠ±Ρ ΠΎΠ΄Π°, ΠΈ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅:
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.β ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π½Π΅ Π² ΠΌΠΎΠΌΠ΅Π½Ρ Add(), Π° ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:
{
Console.WriteLine(user);
if (user == 2)
users.Add(4);
}
ΡΡΠΏΠ΅Π΅Ρ Π²ΡΠ²Π΅ΡΡΠΈ:
1 2ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ. π‘ ΠΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠ½ΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ List<T>, Π½ΠΎ ΠΈ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΉ .NET, Π²ΠΊΠ»ΡΡΠ°Ρ Dictionary<TKey, TValue>, HashSet<T> ΠΈ Π΄ΡΡΠ³ΠΈΠ΅. ΠΡΠ»ΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΠ±Ρ ΠΎΠ΄Π° Π½ΡΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠΈΠΊΠ» for, ΡΠ°Π±ΠΎΡΠ°ΠΉΡΠ΅ Ρ ΠΊΠΎΠΏΠΈΠ΅ΠΉ ΡΠ΅ΡΠ΅Π· ToList() ΠΈΠ»ΠΈ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΠΉΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ. π ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ πΈ ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ°ΡΠΏΠΈΡΡΠ° #dotnet_challenge
ASP.NET Core-ΠΏΡΠΎΠ΅ΠΊΡΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ Π²ΠΎΠΏΡΠΎΡ: ΠΊΡΠ΄Π° Π²ΡΠ½ΠΎΡΠΈΡΡ Π½ΠΎΠ²ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ β
ΠΡΠΎΠ²Π΅ΡΠΊΠΈ Π΄ΠΎΡΡΡΠΏΠ°, feature flags, ΠΊΠΎΠΌΠΏΠ»Π°Π΅Π½Ρ, ΡΠΎΡΠ³ΠΎΠ²ΡΠ΅ ΡΠ°ΡΡ ΠΈ ΡΠ΅Π³ΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°ΡΡ Ρ
Π΅Π½Π΄Π»Π΅ΡΡ Π² Π½Π°Π±ΠΎΡ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΡ
if.
β‘οΈ Π ΠΊΠ°ΡΡΠΎΡΠΊΠ°Ρ
ΡΠ°Π·Π±Π΅ΡΡΠΌ, ΡΠ΅ΠΌ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ Middleware, Endpoint Filters ΠΈ Policy Pipeline, ΠΈ Π² ΠΊΠ°ΠΊΠΈΡ
ΡΠ»ΡΡΠ°ΡΡ
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· Π½ΠΈΡ
.
π Π‘ΡΡΠ»ΠΊΠ°
π ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ
πΈ ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ°ΡΠΏΠΈΡΡΠ°
#il_Π»ΡΠΌΠΈΠ½Π°ΡΠΎΡ
<PropertyGroup> <UseMaterial3>true</UseMaterial3> </PropertyGroup>
π΅ ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π² SR6 (Microsoft.Maui.Controls 10.0.60+) ΠΈ ΡΠΆΠ΅ ΠΎΡ
Π²Π°ΡΡΠ²Π°Π΅Ρ Entry, SearchBar, DatePicker, Slider, Switch, Shell ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ.
Π Π°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° Android.
π€ ΠΠ°ΠΉΠ΄ ΠΏΠΎ GitHub Copilot Π΄Π»Ρ .NET
Microsoft Π²ΡΠΏΡΡΡΠΈΠ»Π° ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π³Π°ΠΉΠ΄ ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ GitHub Copilot Π² .NET-ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ
. ΠΠΎΠ»Π΅Π·Π½ΠΎ ΡΠ΅ΠΌ, ΠΊΡΠΎ ΡΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Copilot ΠΈ Ρ
ΠΎΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΎΡ Π½Π΅Π³ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΠ»ΡΠ·Ρ.
π ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ
πΈ ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ°ΡΠΏΠΈΡΡΠ°
#async_newscsharp new Client { ClientId = Β«banking_appΒ», AccessTokenType = AccessTokenType.Reference };
Π’Π΅ΠΏΠ΅ΡΡ ΡΠΎΠΊΠ΅Π½ Ρ
ΡΠ°Π½ΠΈΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΈΠ½ΡΡΠΎΡΠΏΠ΅ΠΊΡΠΈΡ. ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΎΠ·Π²Π°ΡΡ:
csharp await client.RevokeTokenAsync(new TokenRevocationRequest { Address = Β«https://identity.example.com/connect/revocationΒ», Token = accessToken });
ΠΠΎΡΠ»Π΅ ΠΎΡΠ·ΡΠ²Π° API ΠΏΠΎΠ»ΡΡΠΈΡ:
json { Β«activeΒ»: false }
π ΠΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ:
β Π±Π°Π½ΠΊΠΎΠ²ΡΠΊΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ;
β ΠΌΠ΅Π΄ΠΈΡΠΈΠ½ΡΠΊΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ;
β Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½Π½ΡΠΌΠΈ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌΠΈ ΠΊ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ;
β ΠΊΡΠΈΡΠΈΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π³Π΄Π΅ Π½Π΅Π»ΡΠ·Ρ ΠΆΠ΄Π°ΡΡ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ JWT.
ΠΠ»Π°ΡΠΎΠΉ Π·Π° ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΡΠΉ ΠΎΡΠ·ΡΠ² ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΈΠ½ΡΡΠΎΡΠΏΠ΅ΠΊΡΠΈΡ ΡΠΎΠΊΠ΅Π½Π° Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ°.
π Π§ΠΈΡΠ°ΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅
π ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ
πΈ ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ°ΡΠΏΠΈΡΡΠ°
#sharp_viewΠ ΡΠΊΠΎΠ²ΠΎΠ΄ΠΈΠ» ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ML-ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² ΡΠΈΠ½ΡΠ΅Ρ Π΅ Ρ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΡΡΠ΅ΠΊΡΠΎΠΌ Π±ΠΎΠ»Π΅Π΅ 100 ΠΌΠ»Π½ β½π£ ΠΠ°ΠΏΡΡΠΊ ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ² Π½Π° 6.000+ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ
ΠΠ½ΡΠΎΠ½ ΡΡΡΠΎΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΡ, ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΡΡΡΡΠΈ Π»ΡΠ΄Π΅ΠΉ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΎΠ΄Π΅.π£ Π£ΡΠΊΠΎΡΡΠ΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ
ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π» ML-ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ ΠΈ ΠΊΡΠ°ΡΠ½ΠΎ ΡΠΎΠΊΡΠ°ΡΠΈΠ» Π²ΡΠ΅ΠΌΡ ΠΎΡ Π½Π°ΡΠ°Π»Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄ΠΎ ΡΠ΅Π»ΠΈΠ·Π°π ΠΠ΄Π΅ ΠΠ½ΡΠΎΠ½ ΡΠ΅ΡΠΏΠ°Π΅Ρ Π·Π½Π°Π½ΠΈΡ (ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ ΡΠΊΡΠΏΠ΅ΡΡΠ°): - X* β Π³Π»Π°Π²Π½ΡΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ Π±Π»ΠΎΠ³ ΠΠΎΡΠΈΡΠ° Π§Π΅ΡΠ½ΠΈ (ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ Claude Code) β ΡΠ°ΠΌ Π±Π°Π·Π° ΠΏΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΠ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅. - ΠΠ΅ΡΠ²ΠΎΡΠΊΠΈΠ½Π³ Π² Π’Π: ΡΠ°ΡΡ LLM ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ ΠΈ AI-ΡΠ°Ρ β Π·Π΄Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΠΎΡΠ²Π΅Ρ ΠΏΠΎΡΡΠΈ Π½Π° Π»ΡΠ±ΠΎΠΉ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΠΎΠΏΡΠΎΡ. - ΠΠΎΠ²ΠΎΡΡΠΈ AI: ΠΊΠ°Π½Π°Π»Ρ Π‘ΠΈΠΎΠ»ΠΎΡΠ½Π°Ρ ΠΈ Denis Sexy IT. ΠΠ° ΠΊΡΡΡΠ΅ Agentops ΠΠ½ΡΠΎΠ½ ΡΡΠΈΡ ΡΡΡΠΎΠΈΡΡ Β«Π½Π΅ΡΠ±ΠΈΠ²Π°Π΅ΠΌΡΠΉΒ» Π±ΡΠΊΠ΅Π½Π΄: ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ, ΡΠ°ΠΉΠΌΠ°ΡΡΠ°ΠΌΠΈ ΠΈ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΠΊΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ, ΡΡΠΎΠ±Ρ Π²Π°ΡΠΈ Π°Π³Π΅Π½ΡΡ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎ 24/7. π ΠΠ°ΠΉΡΠΊΠΈΠ΅ Π‘ΠΠΠΠΠ Π² Proglib Academy! ΠΠΎ ΠΊΠΎΠ½ΡΠ° ΠΌΠ°Ρ Π½Π° Π²ΡΠ΅ ΠΊΡΡΡΡ Π°ΠΊΠ°Π΄Π΅ΠΌΠΈΠΈ (Π²ΠΊΠ»ΡΡΠ°Ρ AgentOps ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ ΠΠ-Π°Π³Π΅Π½ΡΠΎΠ²) Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ ΡΠΊΠΈΠ΄ΠΊΠ° -40%. ΠΡΠΎ Π»ΡΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ, ΡΡΠΎΠ±Ρ Π²ΠΎΠΉΡΠΈ Π² AI-ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ ΠΏΠΎΠ΄ ΠΏΡΠΈΡΠΌΠΎΡΡΠΎΠΌ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠ². Π£Π·Π½Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΈ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠΈ Ρ ΠΠ½ΡΠΎΠ½Π°: π ΠΡΡΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ Π²Π½Π΅Π΄ΡΡΡΡ AI-Π»ΠΎΠ³ΠΈΠΊΡ Π² Π±ΡΠΊΠ΅Π½Π΄ ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΡ ΡΠ΅ΡΠ²ΠΈΡΠ° ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π·Π½Π°ΠΊΠΎΠΌΠΈΡΡ Π²Π°Ρ Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ? π β ΠΠ°, ΠΆΠ΄Π΅ΠΌ Π½ΠΎΠ²ΡΡ Π»ΠΈΡ π₯ β ΠΠΎΠΉΠ΄Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΡΡΡ Π½Π° ΠΊΠ°Π½Π°Π»Ρ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΠ½ΡΠΎΠ½Π° πββοΈ Proglib Academy * - Π·Π°ΠΏΡΠ΅ΡΠ΅Π½ Π² ΡΡ
Microsoft.AgentGovernance.Extensions.ModelContextProtocol. ΠΡΠΎ Public Preview ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ MCP C# SDK, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠ»ΠΎΠΉ governance ΠΊ Π²Π°ΡΠ΅ΠΌΡ MCP-ΡΠ΅ΡΠ²Π΅ΡΡ ΠΎΠ΄Π½ΠΈΠΌ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ.
Π§ΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΏΠ°ΠΊΠ΅Ρ
ΠΠ°ΠΊΠ΅Ρ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΡΡΡ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ IMcpServerBuilder ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠ΅ΡΡΡΠ΅ Π²Π΅ΡΠΈ. Π‘ΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΠΏΡΠΈ ΡΡΠ°ΡΡΠ΅, ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΏΠΎΠ»ΠΈΡΠΈΠΊ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅, ΡΠ°Π½ΠΈΡΠΈΠ·Π°ΡΠΈΡ ΠΎΡΠ²Π΅ΡΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄ Π²ΠΎΠ·Π²ΡΠ°ΡΠΎΠΌ Π² ΠΌΠΎΠ΄Π΅Π»Ρ ΠΈ Π°ΡΠ΄ΠΈΡ Ρ ΠΌΠ΅ΡΡΠΈΠΊΠ°ΠΌΠΈ.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ:
dotnet add package Microsoft.AgentGovernance.Extensions.ModelContextProtocol
ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· ΠΎΠ΄ΠΈΠ½ extension-ΠΌΠ΅ΡΠΎΠ΄:
using AgentGovernance.Extensions.ModelContextProtocol;
builder.Services
.AddMcpServer()
.WithGovernance(options =>
{
options.PolicyPaths.Add("policies/mcp.yaml");
options.DefaultAgentId = "did:mcp:server";
options.ServerName = "contoso-support";
});
Π‘ΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅
ΠΠΎ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΡΡΠ°Π½ΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ, ΠΏΠ°ΠΊΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΈΡ
ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π½Π° ΡΠ³ΡΠΎΠ·Ρ. Π‘ΡΠ΅Π΄ΠΈ Π΄Π΅ΡΠ΅ΠΊΡΠΈΡΡΠ΅ΠΌΡΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ: tool poisoning, ΡΠ°ΠΉΠΏΡΠΊΠ²ΠΎΡΡΠΈΠ½Π³, ΡΠΊΡΡΡΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΡΡ
, schema abuse (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠ»Ρ Π²ΡΠΎΠ΄Π΅ password ΠΈΠ»ΠΈ system_prompt), cross-server Π°ΡΠ°ΠΊΠΈ. ΠΡΠ»ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π½Π΅ ΠΏΡΠΎΡΡΠ» ΠΏΡΠΎΠ²Π΅ΡΠΊΡ, ΡΠ΅ΡΠ²Π΅Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π΅ Π·Π°ΠΏΡΡΡΠΈΡΡΡ. ΠΡΠΎ fail closed Π½Π° ΡΡΠ°ΠΏΠ΅ ΡΡΠ°ΡΡΠ°, Π° Π½Π΅ ΡΠ°Π½ΡΠ°ΠΉΠΌ-ΡΠΈΠ»ΡΡΡ.
ΠΠΎΠ»ΠΈΡΠΈΠΊΠΈ Π²ΡΠ·ΠΎΠ²ΠΎΠ²
ΠΠΎΠ½ΡΡΠΎΠ»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² YAML-ΡΠ°ΠΉΠ»Π°Ρ
. ΠΠΎΠ»ΠΈΡΠΈΠΊΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈ allow/deny Ρ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ°ΠΌΠΈ. ΠΡΠΈΠΌΠ΅Ρ:
apiVersion: governance.toolkit/v1
version: "1.0"
name: mcp-governance-policy
default_action: deny
rules:
- name: allow-echo
condition: "tool_name == 'echo'"
action: allow
priority: 10
ΠΡΠ»ΠΈ Π²ΡΠ·ΠΎΠ² Π·Π°ΠΏΡΠ΅ΡΡΠ½, ΠΏΠ°ΠΊΠ΅Ρ Π²Π΅ΡΠ½ΡΡ governed error result Π²ΠΌΠ΅ΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°. ΠΠΎΠ»ΠΈΡΠΈΠΊΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ identity: Π΅ΡΠ»ΠΈ Π΅ΡΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ, Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΡΠ°ΡΡΠ²ΡΠ΅Ρ Π² ΠΎΡΠ΅Π½ΠΊΠ΅. ΠΡΠ»ΠΈ Π½Π΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ fallback DID, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ did:mcp:anonymous.
Π‘Π°Π½ΠΈΡΠΈΠ·Π°ΡΠΈΡ ΠΎΡΠ²Π΅ΡΠΎΠ²
ΠΡΠ²Π΅ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΠΏΡΠΎΡ
ΠΎΠ΄ΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ°Π½ΠΈΡΠ°ΠΉΠ·Π΅Ρ Π΄ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΡ. ΠΠ½ ΠΈΡΠ΅Ρ prompt-injection ΡΠ΅Π³ΠΈ (<system>...</system>), ΡΡΠ°Π·Ρ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π²ΡΠΎΠ΄Π΅ Β«ignore previous instructionsΒ», ΠΏΠ°ΡΡΠ΅ΡΠ½Ρ ΡΡΠ΅ΡΠΊΠΈ credentials ΠΈ URL Π΄Π»Ρ ΡΠΊΡΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ
. ΠΠΏΠ°ΡΠ½ΡΠ΅ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΡ Π²ΡΡΠ΅Π·Π°ΡΡΡΡ, ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅Π½Ρ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΡΡΡ.
ΠΠ΅ΡΠΎΠ»ΡΡ ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ
ΠΠ°ΠΊΠ΅Ρ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π·Π°ΡΠΈΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ. ScanToolsOnStartup, FailOnUnsafeTools, SanitizeResponses, GovernFallbackHandlers, EnableAudit, EnableMetrics β Π²ΡΡ ΡΡΠΎ true ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ.
ΠΡΠΎΠ³ΠΎ
ΠΠ°ΠΊΠ΅Ρ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠΎΡΠΊΠ° SDK ΠΈ Π½Π΅ Π²Π²ΠΎΠ΄ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΠΊΡΠΈ-ΠΏΡΠΎΡΠ΅ΡΡ. ΠΠ½ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ToolCollection Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΌ builder-ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π΅ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌ, Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ Π΄ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° .WithGovernance(). Π Π°Π±ΠΎΡΠ°Π΅Ρ Ρ .NET 8+.
ΠΡΠ»ΠΈ Π²Ρ ΡΡΡΠΎΠΈΡΠ΅ MCP-ΡΠ΅ΡΠ²Π΅ΡΡ Π΄Π»Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ
ΠΊΠΎΠΏΠ°ΠΉΠ»ΠΎΡΠΎΠ² ΠΈΠ»ΠΈ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΡΡ
Π°Π³Π΅Π½ΡΠΎΠ², ΡΡΠΎ Π³ΠΎΡΠΎΠ²ΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π΄ΠΎΡΡΡΠΏΠ°, Π°ΡΠ΄ΠΈΡ ΠΈ Π·Π°ΡΠΈΡΡ ΠΎΡ ΠΈΠ½ΡΠ΅ΠΊΡΠΈΠΉ Π±Π΅Π· ΡΡΡΠ½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ΅ΡΠ²ΠΈΡΠ΅.
β‘οΈ ΠΠ»ΠΎΠ³ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ²
π ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ
πΈ ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ°ΡΠΏΠΈΡΡΠ°
#sharp_viewSystem.Text.Json, System.Memory ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΆΠ΅ Π΅ΡΡΡ Π² ΡΠ°Π½ΡΠ°ΠΉΠΌΠ΅ Π² Π±ΠΎΠ»Π΅Π΅ ΡΠ²Π΅ΠΆΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ.
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π΅ΡΡΡ, Π° ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π΅Ρ. Π .NET 10 ΡΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ ΠΈΡΠΏΡΠ°Π²ΠΈΠ»ΠΈ.
Π ΡΡΠΌ Π±ΡΠ»Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°
ΠΠ½ΠΎΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π½Π° nuget.org ΡΠ°ΡΠ³Π΅ΡΡΡ netstandard2.0 ΠΈ ΡΡΠ½ΡΡ Π·Π° ΡΠΎΠ±ΠΎΠΉ ΠΏΠ°ΠΊΠ΅ΡΡ Π²ΡΠΎΠ΄Π΅ System.Text.Json 8.0.0. ΠΡΠΎΠ΅ΠΊΡ Π½Π° .NET 10 ΡΠΆΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΡ
Π² ΡΠ°Π½ΡΠ°ΠΉΠΌΠ΅ Π² Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ, Π½ΠΎ NuGet Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΡΠ΅Π·ΠΎΠ»Π²ΠΈΡ ΡΡΠ°ΡΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ Π² Π³ΡΠ°Ρ. ΠΠΎΠ³Π΄Π° Π½Π° Π½Π΅Π³ΠΎ ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΡΡΡ CVE, ΡΠΊΠ°Π½Π΅Ρ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΡΡΠ·Π²ΠΈΠΌΡΠΉ.
ΠΠΎ ΡΠ°ΠΊΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π²Π΅ΡΡΠΈΡ ΠΈΠ· ΡΠ°Π½ΡΠ°ΠΉΠΌΠ°. ΠΡΠΎ Π»ΠΎΠΆΠ½ΠΎΠ΅ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠ΅, Π½ΠΎ ΠΎΡΠ»ΠΈΡΠΈΡΡ Π΅Π³ΠΎ ΠΎΡ Π½Π°ΡΡΠΎΡΡΠ΅Π³ΠΎ Π±Π΅Π· ΡΡΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΎΡΠ° ΡΠ»ΠΎΠΆΠ½ΠΎ.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ package pruning
Package pruning ΡΠ±ΠΈΡΠ°Π΅Ρ ΠΈΠ· Π³ΡΠ°ΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΏΠ°ΠΊΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΆΠ΅ ΠΏΠΎΡΡΠ°Π²Π»ΡΡΡΡΡ .NET Runtime Libraries. NuGet ΠΏΡΠΈ restore ΡΠ²Π΅ΡΡΠ΅ΡΡΡ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², Π²Ρ
ΠΎΠ΄ΡΡΠΈΡ
Π² ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ. ΠΡΠ»ΠΈ ΡΡΠ°Π½Π·ΠΈΡΠΈΠ²Π½Π°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, ΠΎΠ½Π° ΠΈΡΠΊΠ»ΡΡΠ°Π΅ΡΡΡ. ΠΠ°ΠΊΠ΅Ρ Π½Π΅ ΡΠΊΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ ΠΈ Π½Π΅ ΡΠΈΠ³ΡΡΠΈΡΡΠ΅Ρ Π² Π°ΡΠ΄ΠΈΡΠ΅.
ΠΠ»Ρ ΠΏΡΡΠΌΡΡ
PackageReference Π»ΠΎΠ³ΠΈΠΊΠ° Π΄ΡΡΠ³Π°Ρ: NuGet ΡΡΠ°Π²ΠΈΡ PrivateAssets='all' ΠΈ IncludeAssets='none'. Π‘ΡΡΠ»ΠΊΠ° ΠΎΡΡΠ°ΡΡΡΡ Π² csproj, ΠΏΠΎΠΊΠ° Π²Ρ ΡΠ°ΠΌΠΈ Π΅Ρ Π½Π΅ ΡΠ΄Π°Π»ΠΈΡΠ΅. ΠΡΠ»ΠΈ ΠΏΠ°ΠΊΠ΅Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ±ΡΠ°ΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ, NuGet Π²ΡΠ΄Π°ΡΡ NU1510.
Pruning ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ
Π²Π΅ΡΡΠΈΠΈ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°. ΠΡΠΎΠ΅ΠΊΡ Π½Π° net8.0 Ρ ΡΡΠ°Π½Π·ΠΈΡΠΈΠ²Π½ΠΎΠΉ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ System.Text.Json 9.0.0 Π½Π΅ ΡΠ±Π΅ΡΡΡ ΠΏΠ°ΠΊΠ΅Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ 8.0.x.
Π§ΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ Π² .NET 10
Package pruning Π²ΠΏΠ΅ΡΠ²ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ ΠΊΠ°ΠΊ opt-in Π² SDK 9.0.200. Π .NET 10 ΠΎΠ½ Π²ΠΊΠ»ΡΡΡΠ½ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ net10.0 ΠΈ Π²ΡΡΠ΅. ΠΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ NuGetAuditMode ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΡΠ°Π» all, ΡΠΎ Π΅ΡΡΡ NuGet ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΈ ΡΡΠ°Π½Π·ΠΈΡΠΈΠ²Π½ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ.
ΠΠΎ ΡΠ΅Π»Π΅ΠΌΠ΅ΡΡΠΈΠΈ Microsoft, ΠΏΡΠΎΠ΅ΠΊΡΡ Ρ Π½ΠΎΠ²ΡΠΌΠΈ Π΄Π΅ΡΠΎΠ»ΡΠ°ΠΌΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π½Π° 70% ΠΌΠ΅Π½ΡΡΠ΅ ΡΡΠ°Π½Π·ΠΈΡΠΈΠ²Π½ΡΡ
ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΎΠ± ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡΡ
. Restore ΡΡΠΊΠΎΡΡΠ΅ΡΡΡ Π΄ΠΎ 50% Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π·Π° ΡΡΡΡ ΠΌΠ΅Π½ΡΡΠ΅Π³ΠΎ Π³ΡΠ°ΡΠ°.
ΠΠ΅ΡΠΎΠ»ΡΠ½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ .NET 10:
<PropertyGroup>
<NuGetAuditMode>all</NuGetAuditMode>
<RestoreEnablePackagePruning>true</RestoreEnablePackagePruning>
</PropertyGroup>
ΠΡΠ°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎΡΠ½Π΅Π΅ ΠΎΡΡΠ°ΠΆΠ°Π΅Ρ ΡΠΎ, ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅Π°Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ. ΠΠ΅Π½ΡΡΠ΅ Π»ΠΎΠΆΠ½ΡΡ
ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠΉ, Π±ΡΡΡΡΠ΅Π΅ restore, ΠΏΠΎΠ½ΡΡΠ½Π΅Π΅ Π°ΡΠ΄ΠΈΡ. ΠΠ»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Π½Π° .NET 10 Π²ΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ.
β‘οΈ ΠΠ»ΠΎΠ³ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ²
π ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ
πΈ ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ°ΡΠΏΠΈΡΡΠ°
#sharp_view.g.cs ΡΠ°ΠΉΠ»Ρ Π½Π΅ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π½Π° Π΄ΠΈΡΠΊ. ΠΠ½ΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°. ΠΠΎΠ³Π΄Π° ΡΡΠΎ-ΡΠΎ Π»ΠΎΠΌΠ°Π΅ΡΡΡ, Π²Ρ Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΎΡΠΈΠ±ΠΊΡ Π² ΡΠ°ΠΉΠ»Π΅, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠΊΡΡΡΡ.
ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π² Directory.Build.props Π² ΠΊΠΎΡΠ½Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ:
<Project>
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>
$(BaseIntermediateOutputPath)generated
</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
</Project>
Π’Π΅ΠΏΠ΅ΡΡ Π²ΡΠ΅ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π² ΠΏΠ°ΠΏΠΊΡ obj/generated. ΠΡ
ΠΌΠΎΠΆΠ½ΠΎ ΡΠΈΡΠ°ΡΡ, ΠΈΡΠΊΠ°ΡΡ ΠΏΠΎ Π½ΠΈΠΌ ΠΈ ΡΡΠ°Π²ΠΈΡΡ ΡΠΎΡΠΊΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²Π° Π² ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ΅. ΠΡΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, ΠΈ ΠΎΠ½Π° ΡΡΠΎΠΈΡ ΡΠΎΠ³ΠΎ.
ΠΠ°ΠΌΠ΅ΡΡΠΉΡΠ΅ Π²ΡΠ΅ΠΌΡ ΡΠ΅ΡΠ΅Π· binary log
ΠΡΡΡΠ΅Π½ΠΈΠ΅ Β«Π±ΠΈΠ»Π΄ ΡΡΠ°Π» ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅Β» Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π΄Π°ΡΡ. ΠΡΠΆΠ½Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ ΡΠΈΡΠ»Π° ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ. Π‘ΠΎΠ±Π΅ΡΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡ Ρ ΡΠ»Π°Π³ΠΎΠΌ:
dotnet build -bl
ΠΡΠΊΡΠΎΠΉΡΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ msbuild.binlog Π² MSBuild Structured Log Viewer. ΠΠ°ΠΉΠ΄ΠΈΡΠ΅ Π·Π°Π΄Π°ΡΡ CSC. ΠΠ½ΡΡΡΠΈ Π±ΡΠ΄Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ
Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΎΠ² Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
. Π‘ΠΎΠ±ΠΈΡΠ°ΠΉΡΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Π° Π½Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ. Π‘ΡΠΎΠΈΠΌΠΎΡΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° ΡΠΌΠ½ΠΎΠΆΠ°Π΅ΡΡΡ Π½Π° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π΅Π³ΠΎ ΠΏΠΎΠ΄ΡΡΠ³ΠΈΠ²Π°ΡΡ.
ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΡΠ°Π½Π·ΠΈΡΠΈΠ²Π½ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡΡ ΠΊΠΎΠ΄Π° ΠΏΡΠΈΠ΅Π·ΠΆΠ°ΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ NuGet-ΠΏΠ°ΠΊΠ΅ΡΠ°ΠΌΠΈ. ΠΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΌΠ°ΠΏΠΏΠ΅Ρ, Π° Π²Π½ΡΡΡΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ° Π»Π΅ΠΆΠΈΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅ΠΏΠ΅ΡΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅. ΠΡ Π΅Π³ΠΎ Π½Π΅ Π²ΡΠ±ΠΈΡΠ°Π»ΠΈ, Π½ΠΎ ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
Π ΡΠΎΠΌ ΠΆΠ΅ binary log Π·Π°Π΄Π°ΡΠ° CSC ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π²ΡΠ΅ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΠ΅ ΡΠ±ΠΎΡΠΊΠΈ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠΎΠ² ΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΎΠ². ΠΡΠΎΠΉΠ΄ΠΈΡΠ΅ΡΡ ΠΏΠΎ ΡΠΏΠΈΡΠΊΡ. ΠΡΠ»ΠΈ Π²ΠΈΠ΄ΠΈΡΠ΅ Π½Π΅Π·Π½Π°ΠΊΠΎΠΌΠΎΠ΅ ΠΈΠΌΡ, Π²ΡΡΡΠ½ΠΈΡΠ΅, ΠΎΡΠΊΡΠ΄Π° ΠΎΠ½ΠΎ ΠΏΡΠΈΡΠ»ΠΎ. ΠΠΎΠΌΠ°Π½Π΄Π° dotnet nuget why ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΠ»Π΅Π΄ΠΈΡΡ ΡΠ΅ΠΏΠΎΡΠΊΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ
ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ²ΠΎΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ, ΡΠ΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ IIncrementalGenerator, Π° Π½Π΅ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΉ ISourceGenerator. ΠΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΊΠ΅ΡΠΈΡΡΠ΅Ρ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ. ΠΡΠ»ΠΈ Π²Ρ
ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈΡΡ, ΠΎΠ½ ΠΏΡΠΎΠΏΡΡΠΊΠ°Π΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ.
ΠΠΎ ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ. ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ IIncrementalGenerator ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΠ΅ΡΠ΅ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ Π²ΡΡ Π·Π°Π½ΠΎΠ²ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²ΡΠ·ΠΎΠ², ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ°ΠΊ ΠΆΠ΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΊΠ°ΠΊ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΉ. ΠΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ΅Π°Π»ΡΠ½ΡΠΌ. ΠΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π½ΡΠΆΠ½ΠΎ ΡΡΡΠΎΠΈΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΡΠ΅ Π²Ρ
ΠΎΠ΄Ρ Π΄Π°Π²Π°Π»ΠΈ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π²ΡΡ
ΠΎΠ΄.
ΠΡΠΈΠ½ΠΈΠΌΠ°ΠΉΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΈΡΠ»Π°ΠΌ
ΠΡΠ»ΠΈ Π΄ΠΎΡΠΎΠ³ΠΎΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΏΡΠΈΡΡΠ» ΠΈΠ· ΡΡΠΎΡΠΎΠ½Π½Π΅Π³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°, Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΅Π³ΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ. ΠΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΅ΡΠΈΡΡ, ΡΡΠΎΠΈΡ Π»ΠΈ ΠΏΠ°ΠΊΠ΅Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ±ΠΎΡΠΊΠΈ. ΠΠ½ΠΎΠ³Π΄Π° ΡΡΠΎΠΈΡ. ΠΠ½ΠΎΠ³Π΄Π° Π΄Π΅ΡΠ΅Π²Π»Π΅ ΠΎΡΠΊΠ°Π·Π°ΡΡΡΡ ΠΎΡ ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΈ ΡΠ΅ΡΠΈΡΡ Π·Π°Π΄Π°ΡΡ ΠΈΠ½Π°ΡΠ΅.
ΠΠ»Π°Π²Π½ΠΎΠ΅ ΡΡΡ Π½Π΅ Π³Π°Π΄Π°ΡΡ, Π° ΡΠΌΠΎΡΡΠ΅ΡΡ Π² binary log. Π’Π°ΠΌ Π΅ΡΡΡ ΠΈΠΌΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° ΠΈ Π΅Π³ΠΎ ΡΡΠΎΠΈΠΌΠΎΡΡΡ Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
. ΠΡΠΎΠ³ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠΈΠ½ΡΡΡ ΠΎΡΠΎΠ·Π½Π°Π½Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
π ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ
πΈ ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ°ΡΠΏΠΈΡΡΠ°
#sharp_viewunsafe. ΠΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΡΠΎ Β«Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈΒ». ΠΠ½ΠΎ ΡΡΠ°Π½Π΅Ρ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΠΌ ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ. ΠΡΠ΅Π²ΡΡ ΠΏΠΎΡΠ²ΠΈΡΡΡ Π² .NET 11, ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½-ΡΠ΅Π»ΠΈΠ· Π² .NET 12.
ΠΡΠΎΠ±Π»Π΅ΠΌΠ°
Π‘Π΅ΠΉΡΠ°Ρ unsafe Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Β«Π·Π΄Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈΒ». ΠΠ½ Π½Π΅ Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΡΡΠ² Π½Π° Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΡΡΠΎΡΠΎΠ½Ρ. ΠΠ΅ΡΠΎΠ΄ Π²ΡΠΎΠ΄Π΅ Marshal.ReadByte ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ IntPtr, ΡΠ°Π·ΡΠΌΠ΅Π½ΠΎΠ²ΡΠ²Π°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π²Π½ΡΡΡΠΈ, Π½ΠΎ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΈΠ· Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π±Π΅Π· ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ. ΠΠΎΠ½Π²Π΅Π½ΡΠΈΠΈ Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΈ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ ΡΠ΅Π²ΡΡΠ΅Ρ Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π²Π·Π³Π»ΡΠ΄Π°.
Π§ΡΠΎ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ
unsafe Π² ΡΠΈΠ³Π½Π°ΡΡΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΠ΅ΠΏΠ΅ΡΡ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ: Π²ΡΠ·ΡΠ²Π°ΡΡΠ°Ρ ΡΡΠΎΡΠΎΠ½Π° ΠΎΠ±ΡΠ·Π°Π½Π° Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π·Π°Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ. ΠΠ°ΠΆΠ΄Π°Ρ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΎΠ±ΡΡΠ½ΡΡΠ° Π²ΠΎ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ Π±Π»ΠΎΠΊ unsafe { }. ΠΠ°ΠΆΠ΄ΡΠΉ unsafe-ΠΌΠ΅ΡΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π±Π»ΠΎΠΊ /// <safety> Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΡΡΠ².
ΠΠΎΡ Marshal.ReadByte Π² Π½ΠΎΠ²ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ:
/// <safety>
/// Π‘ΡΠΌΠΌΠ° ptr ΠΈ ofs Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° Π±Π°ΠΉΡ,
/// Π΄ΠΎΡΡΡΠΏΠ½ΡΠΉ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Π΅ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ.
/// </safety>
public static unsafe byte ReadByte(IntPtr ptr, int ofs)
{
byte* addr = (byte*)ptr;
unsafe
{
// SAFETY: ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΡΡ Π½Π° ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Ρ.
return addr[ofs];
}
}
ΠΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (byte*)ptr Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ, ΡΡΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΡΠ»Π°. Π Π²ΠΎΡ addr[ofs] ΠΎΠΏΠ°ΡΠ½ΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠ°Π·ΡΠΌΠ΅Π½ΠΎΠ²ΡΠ²Π°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ. ΠΠΌΠ΅Π½Π½ΠΎ ΡΡΠ° ΡΡΡΠΎΠΊΠ° ΠΎΠ±ΡΡΠ½ΡΡΠ° Π² unsafe { }.
ΠΡΡΠ³ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ
unsafe Π½Π° ΡΠΈΠΏΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΠ±Π»Π°ΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΎΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π½Π° ΡΡΠΎΠ²Π΅Π½Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΈ ΡΠ²ΠΎΠΉΡΡΠ². unsafe Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π΅ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΠΎΠ·Π΄Π°ΡΡ unsafe-ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ. Π’ΠΈΠΏΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π² ΡΠΈΠ³Π½Π°ΡΡΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΡΡ unsafe, ΠΎΠΏΠ°ΡΠ½Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΠ°Π·ΡΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ. ΠΠΎΠ²ΠΎΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ safe ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄Π»Ρ extern-Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΉ, ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ ΠΎΠ±Π° ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Π½Π΅Π»ΡΠ·Ρ.
ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠΎΠ΄Π΅Π»Ρ Π²ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· Π½ΠΎΠ²ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ <AllowUnsafeBlocks>. ΠΠ»Ρ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΡΡ dotnet format fixer, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠ΅Ρ
Π°Π½ΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π΅ΡΠ½ΡΡ Π²ΡΠ·ΠΎΠ²Ρ Π² unsafe { } ΠΈ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ Ρ ΡΠΈΠΏΠΎΠ² Π½Π° ΠΌΠ΅ΡΠΎΠ΄Ρ. ΠΠΈΡΠ°ΡΡ <safety>-Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΏΡΠΈΠ΄ΡΡΡΡ Π²ΡΡΡΠ½ΡΡ.
ΠΠ°ΡΡΡΠ΅Π½ΠΈΡ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, Π½Π΅ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡΠΌΠΈ. ΠΠΎΠ΄Π΅Π»Ρ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅Ρ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ Rust ΠΈ Swift, Π½ΠΎ Ρ ΡΡΡΡΠΎΠΌ ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΡ .NET. ΠΠ»Ρ ΡΠ΅Ρ
, ΠΊΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ unsafe, ΠΊΠΎΠ΄ ΡΡΠ°Π½Π΅Ρ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½Π΅Π΅ Π΄Π»Ρ ΡΠ΅Π²ΡΡ.
β‘οΈ ΠΠ»ΠΎΠ³ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ²
π ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ
πΈ ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ°ΡΠΏΠΈΡΡΠ°
#sharp_viewServiceLocator.Get<IEmailService>(). ΠΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΈ Π³ΠΈΠ±ΠΊΠΎ. ΠΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ β ΡΡΠΎ Π»ΠΎΠ²ΡΡΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΠ»ΠΎΠΆΠ½ΡΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΠΊΠΎΠ΄Π° Ρ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΠΌΠ΅ΡΡΡΠ΅ΠΌ.
ΠΠ°ΡΠΊ Π‘ΠΈΠΌΠ°Π½Π½ Π½Π°Π·Π²Π°Π» ΡΡΠΎΡ ΠΏΠ°ΡΡΠ΅ΡΠ½ Π°Π½ΡΠΈΠΏΠ°ΡΡΠ΅ΡΠ½ΠΎΠΌ Π΅ΡΡ Π² 2010 Π³ΠΎΠ΄Ρ. Π‘ ΡΠ΅Ρ
ΠΏΠΎΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΡΠ°Π»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΠ»ΡΠ½Π΅Π΅.
Π ΡΡΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°
ΠΠΎΠ³Π΄Π° ΠΊΠ»Π°ΡΡ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, Π²Ρ Π²ΠΈΠ΄ΠΈΡΠ΅ Π²ΡΡ, ΡΡΠΎ Π΅ΠΌΡ Π½ΡΠΆΠ½ΠΎ, ΠΏΡΡΠΌΠΎ Π² ΡΠΈΠ³Π½Π°ΡΡΡΠ΅.
public class OrderService
{
private readonly IEmailService _email;
private readonly IOrderRepository _repo;
public OrderService(IEmailService email, IOrderRepository repo)
{
_email = email;
_repo = repo;
}
}
ΠΠ²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° β Π΄Π²Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ. ΠΡΡ Π½Π° Π²ΠΈΠ΄Ρ.
Π’Π΅ΠΏΠ΅ΡΡ ΡΠΎΡ ΠΆΠ΅ ΠΊΠ»Π°ΡΡ ΡΠ΅ΡΠ΅Π· Service Locator.
public class OrderService
{
public void PlaceOrder(Order order)
{
var repo = ServiceLocator.Get<IOrderRepository>();
repo.Save(order);
var email = ServiceLocator.Get<IEmailService>();
email.SendConfirmation(order);
}
}
Π‘Π½Π°ΡΡΠΆΠΈ OrderService Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ, Π±ΡΠ΄ΡΠΎ Π΅ΠΌΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ. ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠΏΡΡΡΠ°Π½Ρ Π²Π½ΡΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°. Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, ΡΡΠΎ ΠΊΠ»Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ, Π½ΡΠΆΠ½ΠΎ ΡΠΈΡΠ°ΡΡ Π²Π΅ΡΡ Π΅Π³ΠΎ ΠΊΠΎΠ΄. ΠΠ° Π΄Π΅ΡΡΡΠΈ ΠΊΠ»Π°ΡΡΠ°Ρ
ΡΡΠΎ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΠΎ. ΠΠ° ΡΠΎΡΠ½Π΅ β ΡΡΠΎ Π°ΡΡ
Π΅ΠΎΠ»ΠΎΠ³ΠΈΡ.
Π’Π΅ΡΡΡ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°ΡΡΡΡ Π² Π±ΠΎΠ»Ρ
ΠΠ»Ρ ΡΠ½ΠΈΡ-ΡΠ΅ΡΡΠ° Ρ constructor injection Π²Ρ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΠ΅ ΠΌΠΎΠΊΠΈ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ.
var service = new OrderService(mockEmail, mockRepo);
Π‘ Service Locator Π½ΡΠΆΠ½ΠΎ ΡΠ½Π°ΡΠ°Π»Π° Π½Π°ΡΡΡΠΎΠΈΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ ΡΠ΅Π΅ΡΡΡ, Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π² Π½ΡΠΌ Π²ΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ ΠΌΠΎΠΊΠΈ, ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΡΡΠ°ΠΌΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΡΠΈΡΠ°Π΅ΡΡΡ. Π’Π΅ΡΡΡ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ Ρ
ΡΡΠΏΠΊΠΈΠΌΠΈ ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΡΠΌΠΈ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π°.
IServiceProvider Π² Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΠ΅ β ΡΠΎΡ ΠΆΠ΅ Service Locator
Π .NET Π΅ΡΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ DI-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΠΈ ΡΠΎΠ±Π»Π°Π·Π½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ IServiceProvider Π½Π°ΠΏΡΡΠΌΡΡ Π²Π΅Π»ΠΈΠΊ. ΠΠΎ Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ΅ IServiceProvider Π² Π±ΠΈΠ·Π½Π΅Ρ-ΠΊΠ»Π°ΡΡ ΠΈ Π΄ΠΎΡΡΠ°ΡΡΠ΅ ΠΈΠ· Π½Π΅Π³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΡ Π²ΡΡΡΠ½ΡΡ, ΡΡΠΎ ΡΠΎΠ²Π½ΠΎ ΡΠΎΡ ΠΆΠ΅ Service Locator, ΠΏΡΠΎΡΡΠΎ Π² ΠΎΠ±ΡΡΡΠΊΠ΅ ΠΎΡ Microsoft.
// Π’Π°ΠΊ Π΄Π΅Π»Π°ΡΡ Π½Π΅ ΡΡΠΎΠΈΡ
public class ReportGenerator
{
private readonly IServiceProvider _provider;
public ReportGenerator(IServiceProvider provider)
{
_provider = provider;
}
public void Generate()
{
var formatter = _provider.GetRequiredService<IReportFormatter>();
// ...
}
}
ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΎΡ IReportFormatter ΡΠ½ΠΎΠ²Π° ΡΠΏΡΡΡΠ°Π½Π°. ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π³ΠΎΠ²ΠΎΡΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Β«ΠΌΠ½Π΅ Π½ΡΠΆΠ΅Π½ Π²Π΅ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΒ», ΡΡΠΎ Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π½ΠΎ.
ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ.
public class ReportGenerator
{
private readonly IReportFormatter _formatter;
public ReportGenerator(IReportFormatter formatter)
{
_formatter = formatter;
}
public void Generate()
{
// _formatter ΡΠΆΠ΅ Π·Π΄Π΅ΡΡ
}
}
ΠΠΎΠ³Π΄Π° IServiceProvider Π΄ΠΎΠΏΡΡΡΠΈΠΌ
ΠΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΡΠΈΡΡΠ°ΡΠΈΠΉ, Π³Π΄Π΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ IServiceProvider ΠΎΠΏΡΠ°Π²Π΄Π°Π½ΠΎ. Π€Π°Π±ΡΠΈΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Ρ ΡΠ°Π·Π½ΡΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ. ΠΠ»Π°Π³ΠΈΠ½Π½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ, Π³Π΄Π΅ Π½Π°Π±ΠΎΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ½ΡΠΉ ΠΊΠΎΠ΄ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°, middleware, Π°ΠΊΡΠΈΠ²Π°ΡΠΎΡΡ. ΠΠΎ Π²ΡΠ΅Ρ
ΡΡΠΈΡ
ΡΠ»ΡΡΠ°ΡΡ
ΡΠ΅ΡΡ ΠΈΠ΄ΡΡ ΠΎΠ± ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ΅, Π° Π½Π΅ ΠΎ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΠ΅.
ΠΡΠ»ΠΈ Π²Π°Ρ ΠΊΠ»Π°ΡΡ ΡΠ΅ΡΠ°Π΅Ρ Π΄ΠΎΠΌΠ΅Π½Π½ΡΡ Π·Π°Π΄Π°ΡΡ ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΡΠ½Π΅Ρ IServiceProvider, ΡΡΠΎΠΈΡ Π²ΡΠ½Π΅ΡΡΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ. ΠΠΎΠ΄ ΡΡΠ°Π½Π΅Ρ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½Π΅Π΅, ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΠ΅, Π° ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½Π΅Ρ Π±ΡΡΡ ΡΠ°ΡΠΊΠΎΠΏΠΊΠ°ΠΌΠΈ.
π ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ
πΈ ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ°ΡΠΏΠΈΡΡΠ°
#il_Π»ΡΠΌΠΈΠ½Π°ΡΠΎΡ