TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #1998 1.79K
День 1646. #ЗаметкиНаПолях
Scrutor в .NET. Окончание
Начало

Реализация паттерна Декоратор с помощью Scrutor
Мы можем использовать паттерн проектирования Декоратор для расширения функциональности существующего объекта без изменения его кода. Для этой цели декоратор разработан как оболочка вокруг объектов, которые необходимо расширить, чтобы он мог перехватывать вызовы методов обёрнутого объекта.

Реализация простого декоратора
Мы можем использовать метод расширения Decorate() для управления регистрацией объектов-декораторов. Определим декоратор для репозитория, который делает запись в консоль, когда мы обращаемся к списку сущностей.

Для этого нам нужно наследоваться от того же интерфейса, который реализует репозиторий:
public class RepositoryLoggerDecorator<T> : IRepository<T>
{
private readonly IRepository<T> _decoratedRepo;
public RepositoryLoggerDecorator(
IRepository<T> decoratedRepo)
{
_decoratedRepo = decoratedRepo;
}
public IEnumerable<T> GetAll()
{
Console.WriteLine("Retrieved list of users");
return _decoratedRepo.GetAll();
}
}

Декоратор должен принимать в конструкторе экземпляр декорируемого репозитория, в нашем случае это экземпляр IRepository<T>, который мы будем оборачивать. В методе GetAll() мы записываем сообщение в консоль, а затем вызываем метод GetAll() обёрнутого объекта.

Регистрация декораторов в Scrutor
Для регистрации декоратора в контейнере зависимостей в Scrutor используется метод расширения Decorate<,>():
builder.Services
.Decorate<IRepository<User>,
RepositoryLoggerDecorator<User>>();

Первый аргумент типа метода Decorate<,>() представляет тип сервиса, который мы хотим декорировать, а второй аргумент типа — это тип декоратора.

После того, как мы зарегистрируем декоратор в Scrutor, все вызовы методов IRepository<User> будут перехвачены RepositoryLoggingDecorator<User>.

Замечание: В этом примере мы использовали метод Console.WriteLine() для ведения журнала, в реальном же сценарии мы бы использовали ILogger<T> и фреймворк журналирования.

Источник:
https://code-maze.com/dotnet-dependency-injection-with-scrutor/
  • 👍 7
More from @netdeveloperdiary
  1. Oct 10, 2026День 2810. #ЧтоНовенького #VSCode Более Быстрый и Лёгкий C# Dev Kit Мы, разработчики, люби…
  2. Oct 9, 2026День 2809. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Окончание Начало 3.…
  3. Oct 8, 2026День 2808. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Начало В ИТ есть се…
  4. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  5. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  6. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
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 →