@@ -33,7 +33,8 @@ public class ServiceProviderCache
33
33
/// </summary>
34
34
public virtual IServiceProvider GetOrAdd ( [ NotNull ] IDbContextOptions options , bool providerRequired )
35
35
{
36
- var internalServiceProvider = options . FindExtension < CoreOptionsExtension > ( ) ? . InternalServiceProvider ;
36
+ var coreOptionsExtension = options . FindExtension < CoreOptionsExtension > ( ) ;
37
+ var internalServiceProvider = coreOptionsExtension ? . InternalServiceProvider ;
37
38
if ( internalServiceProvider != null )
38
39
{
39
40
ValidateOptions ( options ) ;
@@ -52,78 +53,83 @@ public virtual IServiceProvider GetOrAdd([NotNull] IDbContextOptions options, bo
52
53
return internalServiceProvider ;
53
54
}
54
55
55
- var key = options . Extensions
56
- . OrderBy ( e => e . GetType ( ) . Name )
57
- . Aggregate ( 0L , ( t , e ) => ( t * 397 ) ^ ( ( long ) e . GetType ( ) . GetHashCode ( ) * 397 ) ^ e . GetServiceProviderHashCode ( ) ) ;
56
+ ( IServiceProvider ServiceProvider , IDictionary < string , string > DebugInfo ) BuildServiceProvider ( )
57
+ {
58
+ ValidateOptions ( options ) ;
58
59
59
- return _configurations . GetOrAdd (
60
- key ,
61
- k =>
60
+ var debugInfo = new Dictionary < string , string > ( ) ;
61
+ foreach ( var optionsExtension in options . Extensions )
62
62
{
63
- ValidateOptions ( options ) ;
64
-
65
- var debugInfo = new Dictionary < string , string > ( ) ;
66
- foreach ( var optionsExtension in options . Extensions )
67
- {
68
- optionsExtension . PopulateDebugInfo ( debugInfo ) ;
69
- }
63
+ optionsExtension . PopulateDebugInfo ( debugInfo ) ;
64
+ }
70
65
71
- debugInfo = debugInfo . OrderBy ( v => debugInfo . Keys ) . ToDictionary ( d => d . Key , v => v . Value ) ;
66
+ debugInfo = debugInfo . OrderBy ( v => debugInfo . Keys ) . ToDictionary ( d => d . Key , v => v . Value ) ;
72
67
73
- var services = new ServiceCollection ( ) ;
74
- var hasProvider = ApplyServices ( options , services ) ;
68
+ var services = new ServiceCollection ( ) ;
69
+ var hasProvider = ApplyServices ( options , services ) ;
75
70
76
- var replacedServices = options . FindExtension < CoreOptionsExtension > ( ) ? . ReplacedServices ;
77
- if ( replacedServices != null )
71
+ var replacedServices = coreOptionsExtension ? . ReplacedServices ;
72
+ if ( replacedServices != null )
73
+ {
74
+ // For replaced services we use the service collection to obtain the lifetime of
75
+ // the service to replace. The replaced services are added to a new collection, after
76
+ // which provider and core services are applied. This ensures that any patching happens
77
+ // to the replaced service.
78
+ var updatedServices = new ServiceCollection ( ) ;
79
+ foreach ( var descriptor in services )
78
80
{
79
- // For replaced services we use the service collection to obtain the lifetime of
80
- // the service to replace. The replaced services are added to a new collection, after
81
- // which provider and core services are applied. This ensures that any patching happens
82
- // to the replaced service.
83
- var updatedServices = new ServiceCollection ( ) ;
84
- foreach ( var descriptor in services )
81
+ if ( replacedServices . TryGetValue ( descriptor . ServiceType , out var replacementType ) )
85
82
{
86
- if ( replacedServices . TryGetValue ( descriptor . ServiceType , out var replacementType ) )
87
- {
88
- ( ( IList < ServiceDescriptor > ) updatedServices ) . Add (
89
- new ServiceDescriptor ( descriptor . ServiceType , replacementType , descriptor . Lifetime ) ) ;
90
- }
83
+ ( ( IList < ServiceDescriptor > ) updatedServices ) . Add (
84
+ new ServiceDescriptor ( descriptor . ServiceType , replacementType , descriptor . Lifetime ) ) ;
91
85
}
92
-
93
- ApplyServices ( options , updatedServices ) ;
94
- services = updatedServices ;
95
86
}
96
87
97
- var serviceProvider = services . BuildServiceProvider ( ) ;
88
+ ApplyServices ( options , updatedServices ) ;
89
+ services = updatedServices ;
90
+ }
98
91
99
- if ( hasProvider )
100
- {
101
- serviceProvider
102
- . GetRequiredService < ISingletonOptionsInitializer > ( )
103
- . EnsureInitialized ( serviceProvider , options ) ;
104
- }
92
+ var serviceProvider = services . BuildServiceProvider ( ) ;
93
+
94
+ if ( hasProvider )
95
+ {
96
+ serviceProvider
97
+ . GetRequiredService < ISingletonOptionsInitializer > ( )
98
+ . EnsureInitialized ( serviceProvider , options ) ;
99
+ }
105
100
106
- var logger = serviceProvider . GetRequiredService < IDiagnosticsLogger < DbLoggerCategory . Infrastructure > > ( ) ;
101
+ var logger = serviceProvider . GetRequiredService < IDiagnosticsLogger < DbLoggerCategory . Infrastructure > > ( ) ;
107
102
108
- if ( _configurations . Count == 0 )
103
+ if ( _configurations . Count == 0 )
104
+ {
105
+ logger . ServiceProviderCreated ( serviceProvider ) ;
106
+ }
107
+ else
108
+ {
109
+ logger . ServiceProviderDebugInfo (
110
+ debugInfo ,
111
+ _configurations . Values . Select ( v => v . DebugInfo ) . ToList ( ) ) ;
112
+
113
+ if ( _configurations . Count >= 20 )
109
114
{
110
- logger . ServiceProviderCreated ( serviceProvider ) ;
115
+ logger . ManyServiceProvidersCreatedWarning (
116
+ _configurations . Values . Select ( e => e . ServiceProvider ) . ToList ( ) ) ;
111
117
}
112
- else
113
- {
114
- logger . ServiceProviderDebugInfo (
115
- debugInfo ,
116
- _configurations . Values . Select ( v => v . DebugInfo ) . ToList ( ) ) ;
118
+ }
117
119
118
- if ( _configurations . Count >= 20 )
119
- {
120
- logger . ManyServiceProvidersCreatedWarning (
121
- _configurations . Values . Select ( e => e . ServiceProvider ) . ToList ( ) ) ;
122
- }
123
- }
120
+ return ( serviceProvider , debugInfo ) ;
121
+ }
122
+
123
+ if ( coreOptionsExtension ? . ServiceProviderCachingEnabled == false )
124
+ {
125
+ return BuildServiceProvider ( ) . ServiceProvider ;
126
+ }
127
+
128
+ var key = options . Extensions
129
+ . OrderBy ( e => e . GetType ( ) . Name )
130
+ . Aggregate ( 0L , ( t , e ) => ( t * 397 ) ^ ( ( long ) e . GetType ( ) . GetHashCode ( ) * 397 ) ^ e . GetServiceProviderHashCode ( ) ) ;
124
131
125
- return ( serviceProvider , debugInfo ) ;
126
- } ) . ServiceProvider ;
132
+ return _configurations . GetOrAdd ( key , k => BuildServiceProvider ( ) ) . ServiceProvider ;
127
133
}
128
134
129
135
private static void ValidateOptions ( IDbContextOptions options )
0 commit comments