使用 IsRegistered() 检查服务注册,或使用 ResolveOptional() 方法

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.

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.
            });
        }

        // ...
    }
}

为了重现该错误,我正在尝试以下测试用例:

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;
    }
}

正在调用 RolePermissionManagerExtensions 方法,但出现错误,提示 PermissionManagementProvider 未注册。

PermissionManagementProviderabstract class,所以不要将其添加到 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
        // ...
    });
}