static PermissionHelper()
        {
            var permissionTabViewModels = new List <PermissionTab>();

            var assembly    = Assembly.GetExecutingAssembly();
            var controllers = assembly.GetExportedTypes()
                              .Where(type => type.IsPublic && type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(ControllerBase)) && type.GetCustomAttribute <AllowAnonymousAttribute>() == null)
                              .Select(controller => new
            {
                ControllerFullName  = controller.FullName,
                ControllerName      = GetControllerName(controller),
                ControllerGroupName = GetControllerGroupName(controller),
                Actions             = controller.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public)
                                      .Where(method => method.IsPublic && method.GetCustomAttribute <NonActionAttribute>() == null && method.GetCustomAttribute <AllowAnonymousAttribute>() == null)
                                      .Select(method => new
                {
                    ActionName     = GetActionName(method),
                    ActionFullName = controller.FullName + "." + method.Name
                }).ToList(),
            }).ToList();

            foreach (var tab in controllers.GroupBy(p => p.ControllerGroupName))
            {
                var tabViewModel = new PermissionTab {
                    Name = tab.Key
                };
                foreach (var controller in tab)
                {
                    var controllerViewModel = new PermissionController {
                        Name = controller.ControllerName, FullName = controller.ControllerFullName
                    };
                    foreach (var action in controller.Actions.GroupBy(p => p.ActionName))
                    {
                        var actionViewModel = new PermissionAction
                        {
                            Name      = action.Key,
                            FullNames = action.Select(p => p.ActionFullName).Distinct().ToList()
                        };
                        controllerViewModel.Actions.Add(actionViewModel);
                    }
                    tabViewModel.Controllers.Add(controllerViewModel);
                }
                Tabs.Add(tabViewModel);
            }
        }
        public static IServiceCollection PopulatePermissions(this IServiceCollection services, params Assembly[] assemblies)
        {
            var permissionTabViewModels = new List<PermissionTab>();

            var handlers = assemblies.SelectMany(p => p.GetExportedTypes())
                .Where(type => type.IsPublic && type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(IRequestHandler<,>)) && type.GetCustomAttribute<AllowAnonymousAttribute>() == null)
                .Select(handler =>
                {
                    var attribute = handler.GetCustomAttribute<HandlerInfoAttribute>();
                    var namespaceLastSegment = handler.Namespace.Remove(handler.Namespace.IndexOf('.');
                    return new
                    {
                        handler.FullName,
                        TabName = attribute?.TabName ?? namespaceLastSegment,
                        GroupName = attribute.GroupName ?? namespaceLastSegment,
                        Name = attribute.Name ?? handler.Name
                    };
                }).ToList();

            foreach (var tab in handlers.GroupBy(p => p.TabName))
            {
                var tabViewModel = new PermissionTab { Name = tab.Key };
                foreach (var group in tab.GroupBy(p => p.GroupName))
                {
                    var controllerViewModel = new PermissionRequestGroup { Name = group.ControllerName, FullName = group.ControllerFullName };
                    foreach (var action in group.GroupBy(p => p.Name))
                    {
                        var actionViewModel = new PermissionRequest
                        {
                            Name = action.Key,
                            FullNames = action.Select(p => p.ActionFullName).Distinct().ToList()
                        };
                        controllerViewModel.Actions.Add(actionViewModel);
                    }
                    tabViewModel.Controllers.Add(controllerViewModel);
                }
                List.Add(tabViewModel);
            }
        }