mirror of
https://github.com/pese-git/cherrypick.git
synced 2026-01-23 21:13:35 +00:00
- 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.
4.7 KiB
4.7 KiB
sidebar_position
| sidebar_position |
|---|
| 5 |
Использование аннотаций и генерация кода
CherryPick предоставляет продвинутую эргономику и безопасный DI благодаря аннотациям Dart и генерации кода. Это позволяет избавить вас от рутины — просто аннотируйте классы, поля и модули, запускайте генератор и используйте полностью автосвязанный DI!
Как это работает
- Аннотируйте сервисы, провайдеры и поля с помощью
cherrypick_annotations. - Генерируйте код с помощью
cherrypick_generatorиbuild_runner. - Используйте автосгенерированные модули и миксины для автоматического внедрения.
Поддерживаемые аннотации
| Аннотация | 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 => ...;
}
Шаги использования
- Добавьте зависимости в
pubspec.yaml. - Аннотируйте классы и модули.
- Генерируйте код командой build_runner.
- Регистрируйте модули и используйте автосвязь.
Расширенные возможности
- Используйте
@namedдля внедрения по ключу. - Используйте
@scopeдля внедрения из разных скоупов. - Используйте
@paramsдля передачи runtime-параметров.
Советы и FAQ
- После изменений в DI-коде запускайте build_runner заново.
- Не редактируйте
.g.dartвручную. - Ошибки некорректных аннотаций определяются автоматически.