Тема: dotnet
-
Соглашения внедрения зависимостей в .NET: время жизни, области видимости и ловушка captive dependency
Microsoft.Extensions.DependencyInjection регистрирует сервисы в IServiceCollection со временем жизни transient, scoped или singleton и внедряет их через публичные конструкторы; задокументированные правила гласят: никогда не внедрять scoped-сервис в singleton, позволять контейнеру самому освобождать то, что он создал, избегать вызовов в стиле service locator и включать валидацию областей видимости, чтобы captive dependency обнаруживалась ошибкой при старте, а не утечкой состояния между запросами.
-
Which observability signals should a JVM or .NET service emit by default, and at what overhead?
Open question: both runtimes ship built-in telemetry (Flight Recorder and GC logging on the JVM; EventPipe counters and dotnet-trace on .NET) and both have OpenTelemetry auto-instrumentation, but there is little shared evidence on which of these should be always-on in production, what they cost, and which ones actually shortened incidents.
-
Модульный тест в JUnit 5 и xUnit.net: сравнение аннотаций, жизненного цикла и параметризованных случаев
JUnit Jupiter отмечает тесты через @Test, по умолчанию выполняет @BeforeEach и @AfterEach вокруг каждого теста на новом экземпляре и задаёт случаи по данным через @ParameterizedTest с аннотацией источника. xUnit.net использует [Fact], конструктор и IDisposable для подготовки и очистки каждого теста на новом экземпляре, [Theory] с [InlineData] для случаев и фикстуры для общего дорогостоящего контекста. Одинаковая форма тестов помогает команде с несколькими языками согласовать правила.
-
C# async/await pitfalls: sync-over-async, async void and ConfigureAwait
The classic mistakes in C# asynchronous code are blocking on a Task with .Result, .Wait() or GetAwaiter().GetResult() (deadlocks under a single-threaded SynchronizationContext, thread-pool starvation on servers), async void methods whose exceptions cannot be caught, and misplacing ConfigureAwait(false), which belongs in general-purpose libraries and not in application code.
-
Pinning NuGet dependencies: PackageReference, central package management and packages.lock.json
NuGet resolves the lowest applicable version of each package at restore time, so a restore can drift when new versions or floating ranges appear; a repeatable build declares versions once in Directory.Packages.props, enables RestorePackagesWithLockFile so packages.lock.json records the full closure, commits the lock file for applications, and restores with --locked-mode in CI.
-
Ссылочные типы, допускающие null, в C#: контракт компиляции, а не проверка времени выполнения
При <Nullable>enable</Nullable> компилятор C# считает string не допускающим null, а string? — допускающим, отслеживает состояние null каждого выражения и предупреждает о несоответствиях. Во время выполнения ничего не меняется: string и string? — один и тот же тип. Оператор подавления предупреждений о null ! и атрибуты nullable-анализа ([NotNullWhen], [MemberNotNull]) позволяют сообщить компилятору то, чего он не может вывести сам.
Машиночитаемо: JSON