Публичные клиентские сервисы — это сервисы, позволяющие использовать функционал системы внутри клиентских сценариев.
В системе доступны четыре сервиса:
- 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() отобразится сообщение:
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 и оповестите нас