Введение
Все сервисы находятся в пространстве имен Robin.Engine.Services.Interfaces, для удобства использования можно добавить директиву using
using Robin.Engine.Services.Interfaces;
Для использования сервиса нужно добавить его в конструктор основного класса действия (класса, который наследует BaseRobinAction).
public class MyCustomAction : BaseRobinAction { private readonly IConfigurationService _configurationService; public MyCustomAction(IActionLogger logger, IConfigurationService configurationService) : base(logger) { _configurationService = configurationService; } public override IDictionary<string, object> Execute(IDictionary<string, object> parameters) { return null; } }
ActionLogger
Сервис логирования есть в родительском классе, доступен из каждого действия по имени Logger.
Есть 5 уровней логирования: Debug, Info, Warn, Error и Business. При каждом вызове логгера, производится проверка порога логирования на уровне сценария (устанавливается в приложении, откуда запускается робот) и на уровне действия (устанавливается в студии). Логи уровня бизнес логируются всегда.
Есть перегрузки с форматированной строкой, такая строка попадет в лог студии в таком же виде.
Есть перегрузки с коллбэком, который будет вызван, если уровень сообщения не ниже установленных порогов логирования. Для добавления форматированной строки нужно добавить в словарь пару с ключом "message".
Лог передается из действия в приложение-инициатор сессии (Студия, Плеер, и т. д.) и в файл лога робота.
Методы
void Debug(string message); void Debug(Func<IDictionary<string, string>> parameters); void Info(string message); void Info(Func<IDictionary<string, string>> parameters); void Warn(string message); void Warn(Func<IDictionary<string, string>> parameters); void Error(string message); void Error(Func<IDictionary<string, string>> parameters); void Business(Func<IDictionary<string, string>> parameters);
Примеры использования
using System.Collections.Generic; using Robin.ActionSDK; using Robin.Engine.Services.Interfaces; namespace Robin.SdkExamples { public class MyCustomAction : BaseRobinAction { public MyCustomAction(IActionLogger logger) : base(logger) { } public override IDictionary<string, object> Execute(IDictionary<string, object> parameters) { var infoMessage = (string)parameters["infoMessage"]; var debugMessage = (string)parameters["debugMessage"]; Logger.Debug(() => new Dictionary<string, string> { {"message", debugMessage} }); Logger.Info($"Получено сообщение {infoMessage}"); return null; } } }
ConfigurationService
Сервис для получения конфигурационных параметров, расположенных в файле %LOCALAPPDATA%\robin\env.cfg
Методы
// Получение конфигурационного значения по ключу object GetConfigValue(string key); // Получение всех имеющихся в конфигурационном файле ключей по регулярному выражению List<string> GetKeys(string pattern);
Примеры использования
using System.Collections.Generic; using System.Linq; using Robin.ActionSDK; using Robin.Engine.Services.Interfaces; namespace Robin.SdkExamples { public class GetConfigValue : BaseRobinAction { private readonly IConfigurationService _configurationService; public GetConfigValue(IActionLogger logger, IConfigurationService configurationService) : base(logger) { _configurationService = configurationService; } public override IDictionary<string, object> Execute(IDictionary<string, object> parameters) { var key = (string)parameters["key"]; var pattern = (string)parameters["pattern"]; var valueByKey = _configurationService.GetConfigValue(key); var allKeys = _configurationService.GetKeys(pattern); return new Dictionary<string, object> { { "value", valueByKey }, { "keys", allKeys.Cast<object>().ToList() } }; } } }
ConverterService
Сервис для получения презентационного значения для объекта (не путать с конвертацией в строку). Сервис возвращает значение объекта, представленное в удобном для чтения виде.
Методы
string GetDisplayValue(object nativeObject);
Примеры использования
using System.Collections.Generic; using Robin.ActionSDK; using Robin.Engine.Services.Interfaces; namespace Robin.SdkExamples { public class CheckCollection : BaseRobinAction { private readonly IConverterService _converterService; public CheckCollection(IActionLogger logger, IConverterService converterService) : base(logger) { _converterService = converterService; } public override IDictionary<string, object> Execute(IDictionary<string, object> parameters) { var collection = (List<object>)parameters["collection"]; var displayValue = _converterService.GetDisplayValue(collection); return new Dictionary<string, object> { {"displayValue", displayValue } }; } } }
DisposeService
Сервис для освобождения неуправляемых ресурсов. Метод Dispose будет вызван при завершении работы системы исполнения, даже если робот будет завершаться с ошибкой.
Методы
void RegisterResource(IDisposable disposableResource);
Примеры использования
ResourcesFolderService
Сервис для получения полного пути до папки с ресурсами робота, в этой папке находятся файлы, которые были добавлены к роботу в Студии.
После добавления в студии файла в ресурсы и использования его в параметрах действия, в действие передается имя файла. Для получения полного пути нужно соединить путь до папки с ресурсами и имя файла. Путь до этой папки каждый запуск разный.
Методы
string GetResourcesFolderPath();
Примеры использования
using System.Collections.Generic; using System.IO; using Robin.ActionSDK; using Robin.ActionSDK.Exceptions; using Robin.Engine.Services.Interfaces; using Robin.Types; namespace Robin.SdkExamples { public class ReadFile : BaseRobinAction { private readonly IResourcesFolderService _resourcesFolderService; public ReadFile(IActionLogger logger, IResourcesFolderService resourcesFolderService) : base(logger) { _resourcesFolderService = resourcesFolderService; } public override IDictionary<string, object> Execute(IDictionary<string, object> parameters) { var fileName = ((RobinFilePath)parameters["fileName"]).Value; if (!TryResolveFilePath(fileName, out var filePath)) throw new RobinException($"Файл не найден {fileName}", "Robin.Exception.FileNotFound"); var text = File.ReadAllText(filePath); return new Dictionary<string, object> { {"text", text} }; } private bool TryResolveFilePath(string fileName, out string filePath) { filePath = fileName; if (File.Exists(fileName)) return true; filePath = Path.Combine(_resourcesFolderService.GetResourcesFolderPath(), fileName); return File.Exists(filePath); } } }