AI Core Контексты выполнения приложения

Карта контекстов выполнения, которые используют скрипты, модули и сервисы приложения.

Карта контекстов выполнения приложения

Справочная карта, которая помогает различать код хоста EyeAuras, код только для SDK, top-level скрипты, обычные вспомогательные классы C#, object-style executors и Razor-компоненты.

Что обычно хотят понять

  • Где доступен доступ к зависимостям.
  • Как вынести код из файла скрипта во вспомогательный класс.
  • Нужно ли передавать сервис явно.
  • Чем отличается код модуля приложения или плагина от кода проекта скрипта.

Модель работы

  • Код top-level скрипта выполняется с возможностями, которые предоставляет хост.
  • Обычные файлы C# рядом со скриптом компилируются как обычные классы и не наследуют автоматически члены хоста скрипта.
  • Object-style executors для action и trigger получают контекст через свои базовые классы.
  • Razor-компоненты работают через Blazor [Inject] и правила жизненного цикла компонентов.
  • Код приложения или плагина использует DI и систему модулей приложения.
  • Код только для SDK может ссылаться на контракты, но не должен предполагать наличие активного хоста.

Передать возможность в обычный класс

Если helper должен писать в журнал текущего скрипта, передайте ему готовый IFluentLog. Код вызова находится в Script.csx, а класс можно вынести в обычный .cs файл проекта:

csharp
var worker = new Worker(Log);
worker.Run();

public sealed class Worker
{
    private readonly PoeShared.Logging.IFluentLog log;
    public Worker(PoeShared.Logging.IFluentLog log) => this.log = log;
    public void Run() => log.Info("Worker started");
}

Результат — Worker started в журнале скрипта. Класс не ищет глобальный Log и может работать с другим логгером, если вызывающий код передаст его. Аналогично передавайте API переменных, дерева и токен отмены.

Выбрать способ получения сервиса

Где выполняется кодКак получить зависимостьГраница
Верхнеуровневый скриптЧлен sandbox или GetService<T>()Только регистрации доступных контейнеров и подключённых расширений
Обычный C# классКонструктор или параметр методаНет автоматического доступа к членам sandbox
Razor-компонент[Inject] / @injectТолько сервисы Blazor-host; DataContext передаётся отдельно
Модуль приложенияDI приложения и регистрации PrismИнициализацию выполняет host
Отдельное SDK-приложениеСобственная настройка host/DIСсылка на сборку предоставляет типы, а не работающие сервисы

В AuraScriptSandbox среза 20fd3d4 поиск использует основной Unity-контейнер и зарегистрированные связанные контексты. Это не обещание, что произвольный сервис приложения доступен каждому скрипту. Владение созданными объектами проверяйте по конкретной регистрации; не заменяйте явный using предположением об универсальном автоматическом освобождении.

Ключевые API

  • AuraScriptSandbox / IAuraScriptSandbox — поверхность возможностей top-level скрипта.
  • ScriptContainerExtension — точка регистрации DI для скрипта.
  • CsharpScriptActionExecutor — точка входа для object-style action.
  • CsharpScriptTriggerExecutor — точка входа для object-style trigger.
  • Prism.Modularity.IModule — контракт модуля приложения или плагина.
  • [Inject] — атрибут внедрения зависимостей для компонентов Blazor.
  • [Dependency] — атрибут property injection из Unity, который используется в некоторых runtime-классах.

Что предпочтительно

  • Передавайте зависимости во вспомогательные классы через конструкторы или параметры.
  • Документируйте API, завязанные на конкретные пакеты, в nuget/.
  • Используйте модули приложения для регистраций приложения и плагинов.

Чего избегать

  • Не рассчитывайте, что Log, AuraTree, Variables или cancellationToken будут доступны в обычных helper-классах.
  • Не используйте шаблоны доступа к зависимостям, предназначенные только для скриптов, внутри Razor-компонентов.

Поисковые синонимы

  • top-level script
  • helper class
  • ordinary C# class
  • script globals
  • app module
  • plugin module
  • Blazor component injection
  • object-style action
  • object-style trigger

Связанные карты

Выбрать контекст для готовой операции

Для JS/DOM используйте внедрённый сервис в Razor после появления элементов. Для сериализации верхнеуровневый C# Action получает IConfigSerializer через GetService, а helper принимает его явно. Файловый провайдер отделяет заимствованный сервис от созданного вызывающим потока.

Наследники CsharpScriptActionExecutor и CsharpScriptTriggerExecutor — отдельный случай: зависимости предоставляет их базовый класс и контейнер. Это не основание использовать Variables или Log как глобальные имена в обычном C# классе.