Внедрение зависимостей
Использование внедрения зависимостей в EyeAuras
Что такое Dependency Injection (DI)?
Dependency Injection (DI) — это механизм, который позволяет вашему коду получать доступ к различным сервисам и возможностям программы. Представьте, что у вас есть ящик с инструментами (DI-контейнер), и вы можете просто попросить нужный инструмент по имени, вместо того чтобы создавать его самостоятельно.
Проще говоря:
- Вы говорите: «Мне нужен сервис для управления мышью».
- Программа отвечает: «Вот он, пользуйся».
Такой подход помогает сразу понять, с какими частями программы работает скрипт — видно, какие именно «инструменты» ему нужны.
Это не только упрощает поддержку скриптов, но и открывает возможности для оптимизации: когда понятно, что требуется скрипту, неиспользуемые части можно игнорировать для повышения эффективности.
Способы получения сервисов через DI
1. [Inject] + init (рекомендуется)
Использование init-свойств с атрибутом [Inject] — простой и безопасный способ получить зависимости. Такие свойства инициализируются один раз при запуске скрипта и не могут быть изменены позже.
Пример:
[Inject] public ISendInputScriptingApi SendInput { get; init; }
SendInput.MouseMoveTo(200, 100);
SendInput.MouseRightClick();
Здесь важно вот что:
initозначает "свойство можно заполнить только при инициализации"[Inject]говорит EyeAuras, что это свойство нужно заполнить через DI
2. Атрибут Dependency
Атрибут [Dependency] говорит EyeAuras автоматически инициализировать свойство при запуске скрипта. В отличие от init, такое свойство можно изменять уже после старта.
Пример:
[Dependency] public ISendInputScriptingApi SendInput { get; set; }
SendInput.MouseMoveTo(200, 100);
SendInput.MouseRightClick();
Когда стоит использовать Dependency?
- Когда сервис может меняться динамически (например, при переключении на другое окно)
- Когда вы хотите иметь возможность вручную подменить сервис
3. Метод GetService (самый гибкий вариант)
Метод GetService — самый гибкий способ получить доступ к сервисам в скрипте. Он позволяет запрашивать нужную зависимость «на лету» и сразу использовать её.
Пример для управления мышью:
var sendInput = GetService<ISendInputScriptingApi>();
sendInput.MouseMoveTo(200, 100);
sendInput.MouseRightClick();
Пример для воспроизведения звуков:
using PoeShared.Audio.Services;
var sound = GetService<IPlaySoundScriptingApi>();
sound.PlaySound(AudioNotificationType.Minions);
Когда стоит использовать GetService?
- Когда сервисы нужно создавать динамически и в неопределённом количестве
- Когда сервис может меняться динамически или быть временно недоступен
Какой способ выбрать?
- Используйте
[Inject]+init, если нужен самый простой способ получить доступ к сервисам и вы не планируете менять свойство позже. - Используйте
[Dependency], если хотите иметь возможность менять сервисы во время работы скрипта. - Используйте
GetService, если сервис нужен временно или может динамически меняться.
Если речь уже не про получение существующего сервиса, а про регистрацию своих сервисов и библиотек, смотрите отдельную статью: Script Container Extensions.
Примеры: