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

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

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

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

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

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

Для того, чтобы использовать сервисы можно было максимально удобно и гибко используется принцип компоновки 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.