logo

Локатор сервисов системы

Примечание
Перед началом работы со сценариями рекомендуется ознакомиться со стандартами написания программного кода на языке C#.

В системе ELMA все компоненты объединены при помощи двух ключевых слоев:

  • Точки расширения;
  • Сервисы.

Точки расширения – это интерфейсы, которые нужны для того, чтобы сторонние модули могли расширить функционал системы. Сервисы – это тоже интерфейсы (но не всегда), которые определяют некоторую глобальную функциональность в системе, например, сервис безопасности при помощи которого можно проверить привилегии на объекты.

Использование сервисов

Для того, чтобы использовать сервисы можно было максимально удобно и гибко используется принцип компоновки IOC, т.е. все реализации сервисов регистрируются как абстракции (интерфейсы) в специальном локаторе компонентов.

В системе ELMA доступен статический класс для получения компонентов и сервисов EleWise.ELMA.Services.Locator.

Ниже приводится полное описание методов класса Locator.

C# Code
/// <summary>
/// Менеджер служб
/// </summary>
public static class Locator
{

/// <summary>
/// Получить службу с указанным типом и именем, с проверкой существования службы или без нее
/// </summary>
/// <param name="type">Тип службы</param>
/// <param name="name">Имя службы</param>
/// <param name="checkNotNull">Нужно ли проверить, чтобы служба сущствовала</param>
/// <returns>Запрашиваемая служба</returns>
/// <exception cref="EleWise.ELMA.Exceptions.NotInitializedException">Если менеджер служб не инициализирован</exception>
/// <exception cref="EleWise.ELMA.Exceptions.ServiceNotFoundException">Если запрашиваемая служба не найдена</exception>
[CanBeNull]
public static object GetService(Type type, string name, bool checkNotNull);

/// <summary>
/// Получить службу с указанным типом и именем (без проверки существования)
/// </summary>
/// <param name="type">Тип службы</param>
/// <param name="name">Имя службы</param>
/// <returns>Запрашиваемая служба</returns>
/// <exception cref="EleWise.ELMA.Exceptions.NotInitializedException">Если менеджер служб не инициализирован</exception>
[CanBeNull]
public static object GetService(Type type, string name);

/// <summary>
/// Получить службу с указанным типом и именем (с проверкой существования)
/// </summary>
/// <param name="type">Тип службы</param>
/// <param name="name">Имя службы</param>
/// <returns>Запрашиваемая служба</returns>
/// <exception cref="EleWise.ELMA.Exceptions.NotInitializedException">Если менеджер служб не инициализирован</exception>
/// <exception cref="EleWise.ELMA.Exceptions.ServiceNotFoundException">Если запрашиваемая служба не найдена</exception>
[NotNull]
public static object GetServiceNotNull(Type type, string name);

/// <summary>
/// Получить службу с указанным типом (без проверки существования)
/// </summary>
/// <param name="type">Тип службы</param>
/// <returns>Запрашиваемая служба</returns>
/// <exception cref="EleWise.ELMA.Exceptions.NotInitializedException">Если менеджер служб не инициализирован</exception>
[CanBeNull]
public static object GetService(Type type);

/// <summary>
/// Получить службу с указанным типом (с проверкой существования)
/// </summary>
/// <param name="type">Тип службы</param>
/// <returns>Запрашиваемая служба</returns>
/// <exception cref="EleWise.ELMA.Exceptions.NotInitializedException">Если менеджер служб не инициализирован</exception>
/// <exception cref="EleWise.ELMA.Exceptions.ServiceNotFoundException">Если запрашиваемая служба не найдена</exception>
[NotNull]
public static object GetServiceNotNull(Type type);

/// <summary>
/// Получить службу с указанным типом (без проверки существования)
/// </summary>
/// <typeparam name="T">Тип службы</typeparam>
/// <returns>Запрашиваемая служба</returns>
/// <exception cref="EleWise.ELMA.Exceptions.NotInitializedException">Если менеджер служб не инициализирован</exception>
[CanBeNull]
public static T GetService<T>();

/// <summary>
/// Получить службу с указанным типом (с проверкой существования)
/// </summary>
/// <typeparam name="T">Тип службы</typeparam>
/// <returns>Запрашиваемая служба</returns>
/// <exception cref="EleWise.ELMA.Exceptions.NotInitializedException">Если менеджер служб не инициализирован</exception>
/// <exception cref="EleWise.ELMA.Exceptions.ServiceNotFoundException">Если запрашиваемая служба не найдена</exception>
[NotNull]
public static T GetServiceNotNull<T>();

/// <summary>
/// Получить службу с указанным типом и именем (без проверки существования)
/// </summary>
/// <typeparam name="T">Тип службы</typeparam>
/// <param name="name">Имя службы</param>
/// <returns>Запрашиваемая служба</returns>
/// <exception cref="EleWise.ELMA.Exceptions.NotInitializedException">Если менеджер служб не инициализирован</exception>
[CanBeNull]
public static T GetService<T>(string name);

/// <summary>
/// Получить службу с указанным типом и именем (с проверкой существования)
/// </summary>
/// <typeparam name="T">Тип службы</typeparam>
/// <param name="name">Имя службы</param>
/// <returns>Запрашиваемая служба</returns>
/// <exception cref="EleWise.ELMA.Exceptions.NotInitializedException">Если менеджер служб не инициализирован</exception>
/// <exception cref="EleWise.ELMA.Exceptions.ServiceNotFoundException">Если запрашиваемая служба не найдена</exception>
[NotNull]
public static T GetServiceNotNull<T>(string name);

/// <summary>
/// Зарегистрировать службу
/// </summary>
/// <param name="type">Тип службы</param>
/// <param name="obj">Служба</param>
public static void AddService(Type type, object obj);

/// <summary>
/// Зарегистрировать службу
/// </summary>
/// <param name="type">Тип службы</param>
/// <param name="obj">Служба</param>
/// <param name="resolveProperties">Обрабатывать публичные свойства при регистрации</param>
public static void AddService(Type type, object obj, bool resolveProperties);

/// <summary>
/// Зарегистрировать существующую службу
/// </summary>
/// <typeparam name="T">Тип службы</typeparam>
/// <param name="obj">Служба</param>
public static void AddService<T>(T obj);

/// <summary>
/// Зарегистрировать существующую службу
/// </summary>
/// <typeparam name="T">Тип службы</typeparam>
/// <param name="obj">Служба</param>
/// <param name="resolveProperties">Обрабатывать публичные свойства при регистрации</param>
public static void AddService<T>(T obj, bool resolveProperties);

/// <summary>
/// Разрегистрировать службу
/// </summary>
/// <param name="type">Тип службы</param>
public static void RemoveService(Type type);

/// <summary>
/// Установить реализацию менеджера служб
/// </summary>
/// <param name="locatorImpl">Реализация менеджера служб</param>
public static void SetImpl(ILocatorImpl locatorImpl);

/// <summary>
/// Признак, что менеджер инициализирован
/// </summary>
public static bool Initialized
{
get;
}
}

Для использования же этого класса в сценариях вам нужно всего навсего вызывать методы GetService или GetServiceNotNull.

C# Code
//Получаем сервис аутентификации
var authService = Locator.GetServiceNotNull<IAuthenticationService>();

//Получаем сервис безопасности
var securityService = Locator.GetServiceNotNull<ISecurityService>();

//Проверяем, что у текущего пользователя есть глобальный доступ к Справочникам
if(!securityService.HasPermission(authService.GetCurrentUser(), EleWise.ELMA.Common.PermissionProvider.CatalogsAccessPermission))
{
throw new SecurityException("Нет доступа к справочникам");
}
Необходимо отметить, что все менеджеры объектов тоже являются сервисами

Список доступных сервисов системы вы можете найти в документации API: