Локатор сервисов системы
В системе ELMA все компоненты объединены при помощи двух ключевых слоев:
- Точки расширения;
- Сервисы.
Точки расширения – это интерфейсы, которые нужны для того, чтобы сторонние модули могли расширить функционал системы. Сервисы – это тоже интерфейсы (но не всегда), которые определяют некоторую глобальную функциональность в системе, например, сервис безопасности при помощи которого можно проверить привилегии на объекты.
Использование сервисов
Для того, чтобы использовать сервисы можно было максимально удобно и гибко используется принцип компоновки IOC, т.е. все реализации сервисов регистрируются как абстракции (интерфейсы) в специальном локаторе компонентов.
Ниже приводится полное описание методов класса Locator.
/// Менеджер служб
/// </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.
var authService = Locator.GetServiceNotNull<IAuthenticationService>();
//Получаем сервис безопасности
var securityService = Locator.GetServiceNotNull<ISecurityService>();
//Проверяем, что у текущего пользователя есть глобальный доступ к Справочникам
if(!securityService.HasPermission(authService.GetCurrentUser(), EleWise.ELMA.Common.PermissionProvider.CatalogsAccessPermission))
{
throw new SecurityException("Нет доступа к справочникам");
}
Список доступных сервисов системы вы можете найти в документации API: