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 файл проекта:
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# классе.