Files
cherrypick/website/i18n/ru/docusaurus-plugin-content-docs/current/using-annotations.md
Sergey Penkovsky e0a5ae66f6 fix(docs): comment out all broken links to allow successful Docusaurus build
- Commented out references to non-existent files and examples in both English and Russian documentation:
  - circular-dependency-detection.md
  - logging.md
  - documentation-links.md
  - using-annotations.md
- This fix prevents build failures caused by unresolved links in Docusaurus for both locales.
- All offending links are now non-blocking comments, allowing the site to build and deploy successfully until the related pages are added.
2025-08-14 16:24:57 +03:00

4.7 KiB
Raw Blame History

sidebar_position
sidebar_position
5

Использование аннотаций и генерация кода

CherryPick предоставляет продвинутую эргономику и безопасный DI благодаря аннотациям Dart и генерации кода. Это позволяет избавить вас от рутины — просто аннотируйте классы, поля и модули, запускайте генератор и используйте полностью автосвязанный DI!

Как это работает

  1. Аннотируйте сервисы, провайдеры и поля с помощью cherrypick_annotations.
  2. Генерируйте код с помощью cherrypick_generator и build_runner.
  3. Используйте автосгенерированные модули и миксины для автоматического внедрения.

Поддерживаемые аннотации

Аннотация Target Описание
@injectable() класс Включает автоподстановку полей (генерируется mixin)
@inject() поле Автоподстановка через DI (работает с @injectable)
@module() класс DI-модуль: методы — провайдеры и сервисы
@provide метод Регистрирует как DI-провайдер (можно с параметрами)
@instance метод/класс Регистрирует новый экземпляр (на каждый resolve, factory)
@singleton метод/класс Регистрация как синглтон (один экземпляр на скоуп)
@named поле/параметр Использование именованных экземпляров для внедрения/resolve
@scope поле/параметр Внедрение/resolve из другого (именованного) скоупа
@params параметр Добавляет user-defined параметры во время resolve

Пример Field Injection

import 'package:cherrypick_annotations/cherrypick_annotations.dart';

@injectable()
class ProfilePage with _\$ProfilePage {
  @inject()
  late final AuthService auth;

  @inject()
  @scope('profile')
  late final ProfileManager manager;

  @inject()
  @named('admin')
  late final UserService adminUserService;
}
  • После запуска build_runner миксин _ProfilePage будет сгенерирован для внедрения.
  • Вызовите myProfilePage.injectFields(); чтобы все зависимости были внедрены автоматически.

Пример модуля/провайдера

@module()
abstract class AppModule {
  @singleton
  AuthService provideAuth(Api api) => AuthService(api);

  @named('logging')
  @provide
  Future<Logger> provideLogger(@params Map<String, dynamic> args) async => ...;
}

Шаги использования

  1. Добавьте зависимости в pubspec.yaml.
  2. Аннотируйте классы и модули.
  3. Генерируйте код командой build_runner.
  4. Регистрируйте модули и используйте автосвязь.

Расширенные возможности

  • Используйте @named для внедрения по ключу.
  • Используйте @scope для внедрения из разных скоупов.
  • Используйте @params для передачи runtime-параметров.

Советы и FAQ

  • После изменений в DI-коде запускайте build_runner заново.
  • Не редактируйте .g.dart вручную.
  • Ошибки некорректных аннотаций определяются автоматически.

Ссылки