예제 #1
0
        public void AddOrUpdateApiScalarTypeConfiguration(ApiTypeConfiguration apiTypeConfiguration,
                                                          ApiPrecedenceLevel apiPrecedenceLevel,
                                                          ApiPrecedenceStack apiPrecedenceStack)
        {
            Contract.Requires(apiTypeConfiguration != null);
            Contract.Requires(apiPrecedenceStack != null);

            AddOrUpdateApiTypeConfiguration <ApiScalarTypeConfiguration, ApiMutableFactory <ApiMutableSchema, ApiMutableScalarType>, ApiMutableScalarType>(this.ApiScalarTypeConfigurationDictionary, apiTypeConfiguration,
                                                                                                                                                           ApiScalarTypeConfigurationOpenGenericType, apiPrecedenceLevel, apiPrecedenceStack);
        }
예제 #2
0
        // PRIVATE METHODS //////////////////////////////////////////////////
        #region Methods
        private static void AddOrUpdateApiTypeConfiguration <TConfiguration, TMutableFactory, TMutable>(IDictionary <Type, ApiTypeConfiguration> dictionary,
                                                                                                        ApiTypeConfiguration apiTypeConfiguration,
                                                                                                        Type apiTypeConfigurationOpenGenericType,
                                                                                                        ApiPrecedenceLevel apiPrecedenceLevel,
                                                                                                        ApiPrecedenceStack apiPrecedenceStack)
            where TConfiguration : ApiTypeConfiguration
            where TMutableFactory : ApiMutableFactory <ApiMutableSchema, TMutable>
        {
            Contract.Requires(dictionary != null);
            Contract.Requires(apiTypeConfiguration != null);
            Contract.Requires(apiTypeConfigurationOpenGenericType != null);
            Contract.Requires(apiPrecedenceStack != null);

            var apiConfigurationIncoming = (TConfiguration)apiTypeConfiguration;
            var apiObjectFactoryIncoming = (TMutableFactory)apiConfigurationIncoming.ApiMutableFactory;

            var clrType = apiTypeConfiguration.ClrType;

            if (dictionary.TryGetValue(clrType, out var apiConfiguration))
            {
                // Update the existing API configuration by merging the incoming derived API configuration.
                var apiConfigurationExisting = (TConfiguration)apiConfiguration;
                var apiObjectFactoryExisting = (TMutableFactory)apiConfigurationExisting.ApiMutableFactory;
                apiObjectFactoryExisting.Merge(apiObjectFactoryIncoming);
                return;
            }

            // Create a new API configuration from the incoming derived API configuration.
            var apiConfigurationNew = ApiTypeConfigurationFactory.CreateApiTypeConfiguration <TConfiguration, TMutableFactory, TMutable>(clrType, apiTypeConfigurationOpenGenericType, apiPrecedenceStack, apiObjectFactoryIncoming);

            dictionary.Add(clrType, apiConfigurationNew);

            ApiFrameworkLog.Trace($"Added {typeof(TConfiguration).Name} [ClrType={apiConfigurationNew.ClrType.Name}] at {apiPrecedenceLevel} Level".Indent(IndentConstants.ApiMutableSchemaModifier));
        }