protected void CreateProvidersPolicies <TProviderBase, TProviderConfigurationBase>(
     IPolicyList policyList,
     string defaultProviderName,
     PolymorphicConfigurationElementCollection <TProviderConfigurationBase> configurationObjects,
     IConfigurationSource configurationSource)
     where TProviderBase : class
     where TProviderConfigurationBase : NameTypeConfigurationElement, new()
 {
     CreateProvidersPolicies <TProviderBase, TProviderConfigurationBase>(
         policyList,
         defaultProviderName,
         configurationObjects,
         configurationSource,
         c => c.Name);
 }
        protected void CreateProvidersPolicies <TProviderBase, TProviderConfigurationBase>(
            IPolicyList policyList,
            string defaultProviderName,
            PolymorphicConfigurationElementCollection <TProviderConfigurationBase> configurationObjects,
            IConfigurationSource configurationSource,
            Func <TProviderConfigurationBase, string> getName)
            where TProviderBase : class
            where TProviderConfigurationBase : NameTypeConfigurationElement, new()
        {
            // set the key mapping for the default, if any
            if (!string.IsNullOrEmpty(defaultProviderName))
            {
                TProviderConfigurationBase defaultData = configurationObjects.Get(defaultProviderName);
                if (defaultData == null)
                {
                    throw new ConfigurationErrorsException(
                              string.Format(
                                  CultureInfo.CurrentCulture,
                                  Resources.ExceptionTheSpecifiedDefaultProviderDoesNotExistInConfiguration,
                                  defaultProviderName,
                                  typeof(TProviderBase).FullName));
                }

                policyList.Set <IBuildKeyMappingPolicy>(
                    new BuildKeyMappingPolicy(new NamedTypeBuildKey(defaultData.Type, getName(defaultData))),
                    new NamedTypeBuildKey(typeof(TProviderBase)));
            }

            // set the policies for the providers
            foreach (TProviderConfigurationBase data in configurationObjects)
            {
                string instanceName = getName(data);

                // key mapping from the provider abstraction to the implementation
                policyList.Set <IBuildKeyMappingPolicy>(
                    new BuildKeyMappingPolicy(new NamedTypeBuildKey(data.Type, instanceName)),
                    new NamedTypeBuildKey(typeof(TProviderBase), instanceName));

                IContainerPolicyCreator policyCreator = GetContainerPolicyCreator(data.GetType(), data.Type);
                policyCreator.CreatePolicies(policyList, instanceName, data, configurationSource);
            }
        }