Search code examples
dependency-injectionpermissionsdependency-managementresolveabp-framework

Check for service registration using IsRegistered(), or use the ResolveOptional() method


The requested service 'Volo.Abp.PermissionManagement.PermissionManagementProvider' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.

enter image description here

namespace SecurityDomainModule
{
    [DependsOn(
        typeof(AbpDddDomainModule),
        typeof(SecurityDomainSharedModule),
        typeof(AbpUsersDomainModule),
        typeof(AbpUsersDomainSharedModule),
        typeof(AbpPermissionManagementApplicationContractsModule),
        typeof(AbpPermissionManagementDomainModule),
        typeof(AbpPermissionManagementDomainSharedModule),
        typeof(AbpPermissionManagementDomainIdentityModule),
        typeof(AbpPermissionManagementApplicationContractsModule),
        typeof(AbpPermissionManagementEntityFrameworkCoreModule)
    )]
    public class SecurityDomainModule : AbpModule
    {
        public SecurityDomainModule()
        {
        }

        public override void PreConfigureServices(ServiceConfigurationContext context)
        {
            // ...
            AutoAddPermissionManagementProviders(context.Services);
            // ...
        }

        private static void AutoAddPermissionManagementProviders(IServiceCollection services)
        {
            services.Configure<PermissionManagementOptions>(options =>
            {
                options.ManagementProviders.Add<BusinessSegmentPermissionManagementProvider>();
                options.ManagementProviders.Add<CustomPartnerPermissionmanagementProvider>();
                options.ManagementProviders.Add<CustomTeamPermissionmanagementProvider>();
                options.ManagementProviders.Add<PermissionManagementProvider>();
                //options.ManagementProviders.Add<RolePermissionManagementProvider>();
                // Role and User providers are already added by default. So not adding them here.
            });
        }

        // ...
    }
}

To reproduce the bug, I am trying below test case:

public async Task<List<PermissionWithGrantedProviders>> GetAllForRoleAsync(string roleName)
{
    try
    {
        Check.NotNullOrEmpty(roleName, nameof(roleName));

        var result = await RolePermissionManagerExtensions.GetAllForRoleAsync(_permissionManager, roleName);
        return result;
    }
    catch (Exception ex)
    {
        //TODO log exception return null;
    }
}

Calling RolePermissionManagerExtensions method, however it gives an error saying PermissionManagementProvider is not registered.


Solution

  • PermissionManagementProvider is an abstract class, so don't add it to options.ManagementProviders.

    private static void AutoAddPermissionManagementProviders(IServiceCollection services)
    {
        services.Configure<PermissionManagementOptions>(options =>
        {
            options.ManagementProviders.Add<BusinessSegmentPermissionManagementProvider>();
            options.ManagementProviders.Add<CustomPartnerPermissionmanagementProvider>();
            options.ManagementProviders.Add<CustomTeamPermissionmanagementProvider>();
            options.ManagementProviders.Add<PermissionManagementProvider>(); // Remove this
            // ...
        });
    }