logo

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/// <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 имеет следующие методы:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
[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)

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