@@ -29,7 +29,24 @@ public static class ConfigurationBuilderExtensions
2929 /// </returns>
3030 public static IConfigurationBuilder AddCloudFoundryServiceBindings ( this IConfigurationBuilder builder )
3131 {
32- return builder . AddCloudFoundryServiceBindings ( DefaultIgnoreKeyPredicate , DefaultReader , NullLoggerFactory . Instance ) ;
32+ return builder . AddCloudFoundryServiceBindings ( DefaultIgnoreKeyPredicate , null , CloudFoundryServiceBrokerTypes . All , NullLoggerFactory . Instance ) ;
33+ }
34+
35+ /// <summary>
36+ /// Adds CloudFoundry service bindings from the JSON provided by the specified reader.
37+ /// </summary>
38+ /// <param name="builder">
39+ /// The <see cref="IConfigurationBuilder" /> to add configuration to.
40+ /// </param>
41+ /// <param name="brokerTypes">
42+ /// The set of broker types to read service bindings for.
43+ /// </param>
44+ /// <returns>
45+ /// The incoming <paramref name="builder" /> so that additional calls can be chained.
46+ /// </returns>
47+ public static IConfigurationBuilder AddCloudFoundryServiceBindings ( this IConfigurationBuilder builder , CloudFoundryServiceBrokerTypes brokerTypes )
48+ {
49+ return builder . AddCloudFoundryServiceBindings ( DefaultIgnoreKeyPredicate , null , brokerTypes , NullLoggerFactory . Instance ) ;
3350 }
3451
3552 /// <summary>
@@ -46,7 +63,8 @@ public static IConfigurationBuilder AddCloudFoundryServiceBindings(this IConfigu
4663 /// </returns>
4764 public static IConfigurationBuilder AddCloudFoundryServiceBindings ( this IConfigurationBuilder builder , IServiceBindingsReader serviceBindingsReader )
4865 {
49- return builder . AddCloudFoundryServiceBindings ( DefaultIgnoreKeyPredicate , serviceBindingsReader , NullLoggerFactory . Instance ) ;
66+ return builder . AddCloudFoundryServiceBindings ( DefaultIgnoreKeyPredicate , serviceBindingsReader , CloudFoundryServiceBrokerTypes . All ,
67+ NullLoggerFactory . Instance ) ;
5068 }
5169
5270 /// <summary>
@@ -56,7 +74,7 @@ public static IConfigurationBuilder AddCloudFoundryServiceBindings(this IConfigu
5674 /// The <see cref="IConfigurationBuilder" /> to add configuration to.
5775 /// </param>
5876 /// <param name="ignoreKeyPredicate">
59- /// A predicate which is called before adding a key to the configuration. If it returns false, the key will be ignored.
77+ /// A predicate that is called before adding a key to the configuration. If it returns false, the key will be ignored.
6078 /// </param>
6179 /// <param name="serviceBindingsReader">
6280 /// The source to read JSON service bindings from.
@@ -69,15 +87,43 @@ public static IConfigurationBuilder AddCloudFoundryServiceBindings(this IConfigu
6987 /// </returns>
7088 public static IConfigurationBuilder AddCloudFoundryServiceBindings ( this IConfigurationBuilder builder , Predicate < string > ignoreKeyPredicate ,
7189 IServiceBindingsReader serviceBindingsReader , ILoggerFactory loggerFactory )
90+ {
91+ return AddCloudFoundryServiceBindings ( builder , ignoreKeyPredicate , serviceBindingsReader , CloudFoundryServiceBrokerTypes . All , loggerFactory ) ;
92+ }
93+
94+ /// <summary>
95+ /// Adds CloudFoundry service bindings from the JSON provided by the specified reader.
96+ /// </summary>
97+ /// <param name="builder">
98+ /// The <see cref="IConfigurationBuilder" /> to add configuration to.
99+ /// </param>
100+ /// <param name="ignoreKeyPredicate">
101+ /// A predicate that is called before adding a key to the configuration. If it returns false, the key will be ignored.
102+ /// </param>
103+ /// <param name="serviceBindingsReader">
104+ /// The source to read JSON service bindings from.
105+ /// </param>
106+ /// <param name="brokerTypes">
107+ /// The set of broker types to read service bindings for.
108+ /// </param>
109+ /// <param name="loggerFactory">
110+ /// Used for internal logging. Pass <see cref="NullLoggerFactory.Instance" /> to disable logging.
111+ /// </param>
112+ /// <returns>
113+ /// The incoming <paramref name="builder" /> so that additional calls can be chained.
114+ /// </returns>
115+ public static IConfigurationBuilder AddCloudFoundryServiceBindings ( this IConfigurationBuilder builder , Predicate < string > ignoreKeyPredicate ,
116+ IServiceBindingsReader ? serviceBindingsReader , CloudFoundryServiceBrokerTypes brokerTypes , ILoggerFactory loggerFactory )
72117 {
73118 ArgumentNullException . ThrowIfNull ( builder ) ;
74119 ArgumentNullException . ThrowIfNull ( ignoreKeyPredicate ) ;
75- ArgumentNullException . ThrowIfNull ( serviceBindingsReader ) ;
76120 ArgumentNullException . ThrowIfNull ( loggerFactory ) ;
77121
78- if ( ! builder . EnumerateSources < CloudFoundryServiceBindingConfigurationSource > ( ) . Any ( ) )
122+ CloudFoundryServiceBrokerTypes missingBrokerTypes = GetMissingBrokerTypes ( builder , brokerTypes ) ;
123+
124+ if ( missingBrokerTypes != CloudFoundryServiceBrokerTypes . None )
79125 {
80- var source = new CloudFoundryServiceBindingConfigurationSource ( serviceBindingsReader )
126+ var source = new CloudFoundryServiceBindingConfigurationSource ( serviceBindingsReader ?? DefaultReader , missingBrokerTypes )
81127 {
82128 IgnoreKeyPredicate = ignoreKeyPredicate
83129 } ;
@@ -86,25 +132,71 @@ public static IConfigurationBuilder AddCloudFoundryServiceBindings(this IConfigu
86132 // WebApplicationBuilder immediately builds the configuration provider and loads it, which executes the post-processors.
87133 // Therefore, adding post-processors afterward is a no-op.
88134
89- RegisterPostProcessors ( source , loggerFactory ) ;
135+ RegisterPostProcessors ( source , missingBrokerTypes , loggerFactory ) ;
90136 builder . Add ( source ) ;
91137 }
92138
93139 return builder ;
94140 }
95141
96- private static void RegisterPostProcessors ( CloudFoundryServiceBindingConfigurationSource source , ILoggerFactory loggerFactory )
142+ private static CloudFoundryServiceBrokerTypes GetMissingBrokerTypes ( IConfigurationBuilder builder , CloudFoundryServiceBrokerTypes brokerTypesRequested )
97143 {
98- ILogger < EurekaCloudFoundryPostProcessor > eurekaLogger = loggerFactory . CreateLogger < EurekaCloudFoundryPostProcessor > ( ) ;
99- ILogger < IdentityCloudFoundryPostProcessor > identityLogger = loggerFactory . CreateLogger < IdentityCloudFoundryPostProcessor > ( ) ;
100-
101- source . RegisterPostProcessor ( new EurekaCloudFoundryPostProcessor ( eurekaLogger ) ) ;
102- source . RegisterPostProcessor ( new IdentityCloudFoundryPostProcessor ( identityLogger ) ) ;
103- source . RegisterPostProcessor ( new MongoDbCloudFoundryPostProcessor ( ) ) ;
104- source . RegisterPostProcessor ( new MySqlCloudFoundryPostProcessor ( ) ) ;
105- source . RegisterPostProcessor ( new PostgreSqlCloudFoundryPostProcessor ( ) ) ;
106- source . RegisterPostProcessor ( new RabbitMQCloudFoundryPostProcessor ( ) ) ;
107- source . RegisterPostProcessor ( new RedisCloudFoundryPostProcessor ( ) ) ;
108- source . RegisterPostProcessor ( new SqlServerCloudFoundryPostProcessor ( ) ) ;
144+ CloudFoundryServiceBrokerTypes missingBrokerTypes = brokerTypesRequested ;
145+
146+ if ( brokerTypesRequested != CloudFoundryServiceBrokerTypes . None )
147+ {
148+ foreach ( CloudFoundryServiceBindingConfigurationSource existingSource in builder . EnumerateSources < CloudFoundryServiceBindingConfigurationSource > ( ) )
149+ {
150+ missingBrokerTypes &= ~ existingSource . BrokerTypes ;
151+ }
152+ }
153+
154+ return missingBrokerTypes ;
155+ }
156+
157+ private static void RegisterPostProcessors ( CloudFoundryServiceBindingConfigurationSource source , CloudFoundryServiceBrokerTypes brokerTypes ,
158+ ILoggerFactory loggerFactory )
159+ {
160+ if ( brokerTypes . HasFlag ( CloudFoundryServiceBrokerTypes . Eureka ) )
161+ {
162+ ILogger < EurekaCloudFoundryPostProcessor > eurekaLogger = loggerFactory . CreateLogger < EurekaCloudFoundryPostProcessor > ( ) ;
163+ source . RegisterPostProcessor ( new EurekaCloudFoundryPostProcessor ( eurekaLogger ) ) ;
164+ }
165+
166+ if ( brokerTypes . HasFlag ( CloudFoundryServiceBrokerTypes . Identity ) )
167+ {
168+ ILogger < IdentityCloudFoundryPostProcessor > identityLogger = loggerFactory . CreateLogger < IdentityCloudFoundryPostProcessor > ( ) ;
169+ source . RegisterPostProcessor ( new IdentityCloudFoundryPostProcessor ( identityLogger ) ) ;
170+ }
171+
172+ if ( brokerTypes . HasFlag ( CloudFoundryServiceBrokerTypes . MongoDb ) )
173+ {
174+ source . RegisterPostProcessor ( new MongoDbCloudFoundryPostProcessor ( ) ) ;
175+ }
176+
177+ if ( brokerTypes . HasFlag ( CloudFoundryServiceBrokerTypes . MySql ) )
178+ {
179+ source . RegisterPostProcessor ( new MySqlCloudFoundryPostProcessor ( ) ) ;
180+ }
181+
182+ if ( brokerTypes . HasFlag ( CloudFoundryServiceBrokerTypes . PostgreSql ) )
183+ {
184+ source . RegisterPostProcessor ( new PostgreSqlCloudFoundryPostProcessor ( ) ) ;
185+ }
186+
187+ if ( brokerTypes . HasFlag ( CloudFoundryServiceBrokerTypes . RabbitMQ ) )
188+ {
189+ source . RegisterPostProcessor ( new RabbitMQCloudFoundryPostProcessor ( ) ) ;
190+ }
191+
192+ if ( brokerTypes . HasFlag ( CloudFoundryServiceBrokerTypes . Redis ) )
193+ {
194+ source . RegisterPostProcessor ( new RedisCloudFoundryPostProcessor ( ) ) ;
195+ }
196+
197+ if ( brokerTypes . HasFlag ( CloudFoundryServiceBrokerTypes . SqlServer ) )
198+ {
199+ source . RegisterPostProcessor ( new SqlServerCloudFoundryPostProcessor ( ) ) ;
200+ }
109201 }
110202}
0 commit comments