TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #3119 2K
День 2597. #ЗаметкиНаПолях
5 Архитектурных Тестов Необходимых Каждому .NET-Проекту. Окончание

Начало
Продолжение

4. Тесты видимости
Обработчики команд и запросов — это детали реализации. Они разрешаются через внедрение зависимостей, на них нет прямых ссылок. Но большинство разработчиков по умолчанию делают их публичными. Это просто привычка. Проблема в том, что на публичный обработчик можно напрямую ссылаться из другого слоя, минуя созданные вами абстракции:
public class VisibilityTests : BaseTest
{
[Fact]
public void CommandHandlers_ShouldBeInternal()
{
Classes().That()
.ImplementInterface(typeof(ICommandHandler<>))
.Should().BeInternal()
.Check(Architecture);
}

[Fact]
public void QueryHandlers_ShouldBeInternal()
{
Classes().That()
.ImplementInterface(typeof(IQueryHandler<,>))
.Should().BeInternal()
.Check(Architecture);
}
}

Если вас беспокоит, что DI не обнаружит внутренние классы, не волнуйтесь. Сканирование сборок обнаруживает их без проблем. Вы можете распространить это и на другие типы. Например, гарантировать, что конфигурации EF Core являются внутренними, поскольку нет причин, по которым OrderConfiguration должен быть виден за пределами инфраструктуры.

5. Тесты защиты от зависимостей
Тесты уровня защиты предотвращают ссылки на ваши собственные сборки. Но библиотеки инфраструктуры могут проникать через транзитивные ссылки NuGet. Ваш уровень предметной области не должен знать об Entity Framework. Ваш уровень приложения не должен знать о Npgsql. Компилятор не предотвратит этого, если пакет доступен транзитивно:
public class DependencyGuardTests : BaseTest
{
[Fact]
public void Domain_ShouldNotDependOn_EF()
{
Types().That()
.ResideInAssembly(DomainAssembly).Should()
.NotDependOnAnyTypesThat()
.ResideInNamespace("Microsoft.EntityFrameworkCore")
.Check(Architecture);
}
}

Добавьте все библиотеки, которые подходят для вашего проекта.

Итого
Архитектурные правила, существующие только в документации, будут нарушены. Вопрос только, когда. Все эти тесты выполняются за миллисекунды и не требуют никакой инфраструктуры. Они располагаются рядом с вашими модульными тестами и запускаются при каждой сборке. Архитектурные тесты — это страховочная сеть, которая выявляет нарушения до того, как они попадут в продакшн. Начните с тестов зависимостей слоёв. Их настройка занимает пять минут, и они выявляют наиболее опасные нарушения. Затем добавьте остальные по мере роста вашей кодовой базы.

Источник: https://www.milanjovanovic.tech/blog/5-architecture-tests-you-should-add-to-your-dotnet-projects
  • 👍 5
More from @netdeveloperdiary
  1. Sep 27, 2026День 2797. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Окончание Начало Продол…
  2. Sep 26, 2026День 2796. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Продолжение Начало Три…
  3. Sep 25, 2026День 2795. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Начало Проблема с позиц…
  4. Sep 24, 2026День 2794. #Оффтоп #Здоровье Сегодня будет необычный пост. Завтра в Москве стартует конфер…
  5. Sep 23, 2026День 2793. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
  6. Sep 22, 2026День 2792. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →