Введение

Все сервисы находятся в пространстве имен 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);

Примеры использования

Пример IDisposableService
using System;
using System.Collections.Generic;
using Robin.ActionSDK;
using Robin.Engine.Services.Interfaces;
using Robin.Types;

namespace Robin.SdkExamples
{
    public class OpenFile : BaseRobinAction
    {
        private readonly IDisposeService _disposeService;

        public OpenFile(IActionLogger logger, IDisposeService disposeService) : base(logger)
        {
            _disposeService = disposeService;
        }

        public override IDictionary<string, object> Execute(IDictionary<string, object> parameters)
        {
            var filePath = ((RobinFilePath)parameters["filePath"]).Value;

            var file = new File(filePath);
            file.Open();

            _disposeService.RegisterResource(file);

            return new Dictionary<string, object> { { "file", file } };
        }
    }
   
    internal class File : IDisposable
    {
        private readonly string _filePath;
        private bool _isDisposed;

        public File(string filePath)
        {
            _filePath = filePath;
        }

        public void Open()  { }

        public bool TryReadNextLine(out string line) { }

        public void Close() { }

        public void Dispose()
        {
            if (_isDisposed) return;
            Close();
            _isDisposed = true;
        }
    }
}

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);
        }
    }
}
  • Нет меток