Внедрение зависимостей

Использование внедрения зависимостей в EyeAuras

Что такое Dependency Injection (DI)?

Dependency Injection (DI) — это механизм, который позволяет вашему коду получать доступ к различным сервисам и возможностям программы. Представьте, что у вас есть ящик с инструментами (DI-контейнер), и вы можете просто попросить нужный инструмент по имени, вместо того чтобы создавать его самостоятельно.

Проще говоря:

  • Вы говорите: «Мне нужен сервис для управления мышью».
  • Программа отвечает: «Вот он, пользуйся».

Такой подход помогает сразу понять, с какими частями программы работает скрипт — видно, какие именно «инструменты» ему нужны.
Это не только упрощает поддержку скриптов, но и открывает возможности для оптимизации: когда понятно, что требуется скрипту, неиспользуемые части можно игнорировать для повышения эффективности.


Способы получения сервисов через DI

1. [Inject] + init (рекомендуется)

Использование init-свойств с атрибутом [Inject] — простой и безопасный способ получить зависимости. Такие свойства инициализируются один раз при запуске скрипта и не могут быть изменены позже.

Пример:

csharp
[Inject] public ISendInputScriptingApi SendInput { get; init; }

SendInput.MouseMoveTo(200, 100);
SendInput.MouseRightClick();

Здесь важно вот что:

  • init означает "свойство можно заполнить только при инициализации"
  • [Inject] говорит EyeAuras, что это свойство нужно заполнить через DI

2. Атрибут Dependency

Атрибут [Dependency] говорит EyeAuras автоматически инициализировать свойство при запуске скрипта. В отличие от init, такое свойство можно изменять уже после старта.

Пример:

csharp
[Dependency] public ISendInputScriptingApi SendInput { get; set; }

SendInput.MouseMoveTo(200, 100);
SendInput.MouseRightClick();

Когда стоит использовать Dependency?

  • Когда сервис может меняться динамически (например, при переключении на другое окно)
  • Когда вы хотите иметь возможность вручную подменить сервис

3. Метод GetService (самый гибкий вариант)

Метод GetService — самый гибкий способ получить доступ к сервисам в скрипте. Он позволяет запрашивать нужную зависимость «на лету» и сразу использовать её.

Пример для управления мышью:

csharp
var sendInput = GetService<ISendInputScriptingApi>();
sendInput.MouseMoveTo(200, 100);
sendInput.MouseRightClick();

Пример для воспроизведения звуков:

csharp
using PoeShared.Audio.Services;
var sound = GetService<IPlaySoundScriptingApi>();
sound.PlaySound(AudioNotificationType.Minions);

Когда стоит использовать GetService?

  • Когда сервисы нужно создавать динамически и в неопределённом количестве
  • Когда сервис может меняться динамически или быть временно недоступен

Какой способ выбрать?

  • Используйте [Inject] + init, если нужен самый простой способ получить доступ к сервисам и вы не планируете менять свойство позже.
  • Используйте [Dependency], если хотите иметь возможность менять сервисы во время работы скрипта.
  • Используйте GetService, если сервис нужен временно или может динамически меняться.

Если речь уже не про получение существующего сервиса, а про регистрацию своих сервисов и библиотек, смотрите отдельную статью: Script Container Extensions.

Примеры: