Дизайнер ELMA > Интерфейсы / Публичные клиентские сервисы

Публичные клиентские сервисы

Публичные клиентские сервисы — это сервисы, позволяющие использовать функционал системы внутри клиентских сценариев.

В системе доступны четыре сервиса:

  • IClipboardService — для копирования текста в буфер обмена;
  • ILoaderService — для работы с визуальным загрузчиком;
  • INotificationService — для работы со всплывающими уведомлениями;
  • IRedirectService — для перенаправления.

Чтобы использовать функционал сервисов, нужно сделать инъекцию зависимостей через конструктор и записать значение в приватную переменную readonly:

/// <summary>
/// Контроллер компонента "Компонент А"
/// </summary>
partial class KomponentA
{
    partial class ComponentController
    {
        private readonly ILoaderService loaderService;
        private readonly INotificationService notificationService;
        private readonly IRedirectService redirectService;
 
        public ComponentController(ILoaderService loaderService, INotificationService notificationService, IRedirectService redirectService) {
            this.loaderService = loaderService;
            this.notificationService = notificationService;
            this.redirectService = redirectService;
        }
 
        public async Task OnCLick()
        {
 
        }
    }
}

Рассмотрим каждый сервис подробнее.

IClipboardService

Сервис позволяет скопировать текст в буфер обмена и извлечь его. Доступные методы сервиса:

/// <summary>
/// Сервис для копирования текста в буфер обмена
/// </summary>
public interface IClipboardService
{
    /// <summary>
    /// Скопировать в буфер обмена
    /// </summary>
    /// <param name="text">Текст</param>
    void CopyToClipboard(string text);
 
    /// <summary>
    /// Извлечь текст из буфера
    /// </summary>
    /// <returns>Текст в буфере в обмена или пустую строку</returns>
    Task<string> PasteFromClipboard();
}

ILoaderService

Сервис позволяет управлять визуальным загрузчиком. Доступные методы:

/// <summary>
/// Сервис, для работы с визуальным загрузчиком
/// </summary>
public interface ILoaderService
{
    /// <summary>
    /// Показывает загрузчик с изменённым текстом
    /// </summary>
    /// <param name = "key">Ключ индикатора</param>
    /// <param name = "name">Имя индикатора</param>
    /// <param name = "permanent">Флаг отображения индикатора на всю страницу</param>
    void Show(string key, string name = null, bool permanent false);
    /// <summary>
    /// Скрывает загрузчик
    /// </summary>
    /// <param name = "key">Ключ индикатора</param>
    void Hide(string key);
}

Рассмотрим пример с компонентом, в котором есть кнопка. При клике на неё вызывается функция, которая выполняется очень долго. Реализация действия при нажатии:

public async Task OnCLick()
{
    var key = "loaderKey";
    loaderService.Show(key, SR.T("Долго выполняется метод. Пожалуйста, подождите");
 
    try
    {
        await Context.Heavy(Context.Item);
    }
    catch (Exception ex)
    {
        notificationService.Error(SR.T("Ошибка"), SR.T("Ошибка при выполнении метода. {0}", ex.Message));
    }
    finally
    {
        loaderService.Hide(key);
    }
}

Методы ILoaderService лучше выполнять в связке с try-catch, чтобы при возникновении ошибки загрузчик не зависал надолго.

INotificationService

Сервис позволяет отображать сообщения разных типов: ошибка, предупреждение, информация, сообщение об успешном выполнении. Доступные методы:

/// <summary>
/// Сервис, для работы со всплывающими уведомлениями
/// </summary>
public interface INotificationService
{
    /// <summary>
    /// Сообщение об ошибке
    /// </summary>
    /// <param name = "title">Заголовок</param>
    /// <param name = "message">Тело сообщения</param>
    /// <param name = "autoClosed">Автоматически закрывать сообщение</param>
    void Error(string title, string message, bool autoClosed false);
 
    /// <summary>
    /// Сообщение об успешном выполнении
    /// </summary>
    /// <param name = "title">Заголовок</param>
    /// <param name = "message">Тело сообщения</param>
    /// <param name = "autoClosed">Автоматически закрывать сообщение</param>
    void Success(string title, string message, bool autoClosed false);
 
    /// <summary>
    /// Сообщение с предупреждением
    /// </summary>
    /// <param name = "title">Заголовок</param>
    /// <param name = "message">Тело сообщения</param>
    /// <param name = "autoClosed">Автоматически закрывать сообщение</param>
    void Warning(string title, string message, bool autoClosed false);
 
    /// <summary>
    /// Информационное сообщение
    /// </summary>
    /// <param name = "title">Заголовок</param>
    /// <param name = "message">Тело сообщения</param>
    /// <param name = "autoClosed">Автоматически закрывать сообщение</param>
    void Info(string title, string message, bool autoClosed false);
}

Так, в предыдущем примере с сервисом ILoaderService при неудачном выполнении Context.Heavy() отобразится сообщение:

public-client-services-1

IRedirectService

Сервис перенаправления, позволяющий перезагружать страницу, открывать url в новой вкладке, в том же окне или новом. Доступные методы:

/// <summary>
/// Сервис для перенаправления
/// </summary>
public interface IRedirectService
{
    /// <summary>
    /// Перенаправить на указанный адрес
    /// </summary>
    /// <param name="url">Адрес</param>
    void Redirect(string url);
 
    /// <summary>
    /// Перезагрузить страницу
    /// </summary>
    void Reload();
 
    /// <summary>
    /// Открыть в новой вкладке
    /// </summary>
    /// <param name="url">Адрес</param>
    void OpenInNewTab(string url);
 
    /// <summary>
    /// Открыть в новом окне
    /// </summary>
    /// <param name="url">Адрес</param>
    void OpenInNewWindow(string url);
 
    /// <summary>
    /// Получить текущий Url страницы
    /// </summary>
    /// <returns></returns>
    string GetCurrentUrl();
}

Например, вам нужно реализовать метод, который будет открывать в новой вкладке страницу по ее наименованию. Реализация:

private void OpenPageInNewTab(string pageName)
{
    if (!string.IsNullOrWhiteSpace(pageName))
    {
        var url = string.Format("UI/Page/{0}", pageName);
        redirectService.OpenInNewTab(url);
    }
}

Нашли опечатку? Выделите текст, нажмите ctrl + enter и оповестите нас