Dependency Injection (DI) — это механизм, который позволяет вашему коду получать доступ к различным сервисам и возможностям программы. Представьте, что у вас есть ящик с инструментами (DI-контейнер), и вы можете просто попросить нужный инструмент по имени, вместо того чтобы создавать его самостоятельно.
Проще говоря:
Такой подход помогает сразу понять, с какими частями программы работает скрипт — видно, какие именно «инструменты» ему нужны.
Это не только упрощает поддержку скриптов, но и открывает возможности для оптимизации: когда понятно, что требуется скрипту, неиспользуемые части можно игнорировать для повышения эффективности.
[Inject] + init (рекомендуется)Использование init-свойств с атрибутом [Inject] — простой и безопасный способ получить зависимости. Такие свойства инициализируются один раз при запуске скрипта и не могут быть изменены позже.
Пример:
[Inject] public ISendInputScriptingApi SendInput { get; init; }
SendInput.MouseMoveTo(200, 100);
SendInput.MouseRightClick();
Здесь важно вот что:
init означает "свойство можно заполнить только при инициализации"[Inject] говорит EyeAuras, что это свойство нужно заполнить через DIDependencyАтрибут [Dependency] говорит EyeAuras автоматически инициализировать свойство при запуске скрипта. В отличие от init, такое свойство можно изменять уже после старта.
Пример:
[Dependency] public ISendInputScriptingApi SendInput { get; set; }
SendInput.MouseMoveTo(200, 100);
SendInput.MouseRightClick();
Когда стоит использовать Dependency?
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.
Примеры: