logo

[ELMA3] Реализация событий уровня модуля

В статье приведен пример создания собственного события Вашего модуля. В данном примере при активации и установке модуля будет создаваться системная группа «Группа при активации модуля». Данный функционал можно использовать широко, например, выдавать права автоматически, создавать таблицы в БД, создавать какие-то объекты по умолчанию, но нужно очень аккуратно использовать данный функционал, так как есть вероятность, что при неверном проектировании права будут выдаваться несколько раз и так далее.

Важное замечание
Реализовывать данную точку расширения необходимо в серверной части Вашего модуля.

Пример отображения данных

Рис. 1. Созданная системная группа «Группа при активации модуля» после активации модуля и перезапуска сервера

Методы расширения (интерфейса) IModuleEvents

Точка расширения (интерфейс) IModuleEvents имеет следующие методы:

/// <summary>
/// Установка модуля
/// </summary>
/// <param name="module">Веб-часть модуля приложения</param>
void Installing(IWebModuleUnit module);

/// <summary>
/// Модуль установлен
/// </summary>
/// <param name="module">Веб-часть модуля приложения</param>
void Installed(IWebModuleUnit module);

/// <summary>
/// Включение модуля
/// </summary>
/// <param name="module">Веб-часть модуля приложения</param>
void Enabling(IWebModuleUnit module);

/// <summary>
/// Модуль включен
/// </summary>
/// <param name="module">Веб-часть модуля приложения</param>
void Enabled(IWebModuleUnit module);

/// <summary>
/// Отключение модуля
/// </summary>
/// <param name="module">Веб-часть модуля приложения</param>                
void Disabling(IWebModuleUnit module);

/// <summary>
/// Модуль отключен
/// </summary>
/// <param name="module">Веб-часть модуля приложения</param>        
void Disabled(IWebModuleUnit module);


/// <summary>
/// Деинсталляция модуля
/// </summary>
/// <param name="module">Веб-часть модуля приложения</param>        
void Uninstalling(IWebModuleUnit module);

/// <summary>
/// Модуль деинсталлирован
/// </summary>
/// <param name="module">Веб-часть модуля приложения</param>        
void Uninstalled(IWebModuleUnit module);

Методы расширения (интерфейса) IModuleContainerEvents

Точка расширения (интерфейс) IModuleContainerEvents имеет следующие методы:

/// <summary>
/// Контейнер активирован (все модули, точки расширения загружены). 
/// Вызывается после авполнения активации контейнера. 
/// Контенер автивируется:
/// 1) при запуске приложения
/// 2) при пересоздании контейнера (это приисходит при включении/отключении модуля)
/// </summary>
void Activated();
        
/// <summary>
/// Контейнер уничтожается (вызывается при перезагрузке модулей)
/// </summary>
void Terminating();

Пример класса точки расширения

[Component]
public class ModuleEvents : IModuleEvents, IModuleContainerEvents
{
    private readonly Guid _guid = new Guid("7283F18A-D4DD-492D-B6B8-BC955A38115B");

    public IUserGroup Group()
    {
        var group = UserGroupManager.Instance.Find(a => a.Uid == _guid).FirstOrDefault();
        return @group;
    }

    public void CreateGroups()
    {
        if (Group() == null)
        {
            var group = UserGroupManager.Instance.Create();
            group.CreationAuthor = UserManager.Instance.Load(SecurityConstants.SystemUserUid);
            group.CreationDate = DateTime.Now;
            group.Name = "Группа при активации модуля";
            group.Description = "Группа при активации модуля";
            group.Groups.Add(UserGroupManager.Instance.Load(SecurityConstants.AdminGroupUid));
            group.IsSystem = true;
            group.Uid = _guid;
            group.Save(); 
        }
    }

    public void Activated()
    {
        CreateGroups();

        var securityService = Locator.GetService<SecurityService>();
        if (securityService != null)
        {
            securityService.ResetPermissionsCache();
        }
    }

    public void Terminating() { }

    public void Installing(IWebModuleUnit module) { }

    public void Installed(IWebModuleUnit module)
    {
        CreateGroups();
    }

    public void Enabling(IWebModuleUnit module) { }

    public void Enabled(IWebModuleUnit module) { }

    public void Disabling(IWebModuleUnit module) { }

    public void Disabled(IWebModuleUnit module) { }

    public void Uninstalling(IWebModuleUnit module) { }

    public void Uninstalled(IWebModuleUnit module) { }
}

Как можно заметить, в точке расширения есть методы по отключению/удалению (Disabling, Disabled, Uninstalling, Uninstalled) модуля, но пока данные методы не используются в системе.

Ссылки на элементы API

IModuleEvents (для версий 3.13, 3.15, 4.0)

IModuleContainerEvents (для версий 3.13, 3.15, 4.0)

Прикрепленные файлы