/// <summary>
        /// Checks if the policies are satisfied for the given action.
        /// </summary>
        /// <param name="context">The policies checking context.</param>
        /// <returns>The policies checking result.</returns>
        public async Task <IPolicyResult <TAction> > CheckPoliciesAsync(TPolicyContext context)
        {
            if (this.logger == null)
            {
                // Getting the logger lazilly at the first call.
                this.logger = this.serviceProvider.GetService <ILogger <AuthorizedSpecificActionChecker <TPolicyContext, TAction, TSpecificAction> > >();
            }

            this.logger.LogDebug($"Checking the policies of the {this.SpecificActionType.FullName} specific action.");

            if (this.policies == null)
            {
                // Getting the policies lazilly at the first call.
                this.policies = PolicyCollection.Build(policyTypes, serviceProvider);
            }

            // Returning the specific action if it satisfies all the policies.
            bool result = await this.policies.CheckAsync(context).ConfigureAwait(false);

            if (result)
            {
                this.logger.LogDebug($"All the policies are satisfied. The {this.SpecificActionType.FullName} specific action execution is allowed.");
                return(new AllowedResult <TAction>(this.serviceProvider.GetRequiredService <TSpecificAction>()));
            }

            return(NotAllowedResult <TAction> .Default);
        }
        /// <summary>
        /// Build a policy collection from the policy types using the given service provider.
        /// </summary>
        /// <param name="policyTypes">The types of the policies to satisfy.</param>
        /// <param name="serviceProvider">The service provider.</param>
        /// <returns></returns>
        public static PolicyCollection Build(HashSet <Type> policyTypes, IServiceProvider serviceProvider)
        {
            PolicyCollection policies = new PolicyCollection(serviceProvider);

            foreach (Type policyType in policyTypes)
            {
                policies.Add(serviceProvider.GetRequiredService(policyType) as IPolicy);
            }

            return(policies);
        }