3
3
4
4
using System ;
5
5
using System . Collections . Generic ;
6
- using System . Text ;
7
6
using Microsoft . Azure . WebJobs . Script . WebHost . DependencyInjection ;
8
7
using Microsoft . Extensions . DependencyInjection ;
9
8
using Xunit ;
@@ -12,6 +11,8 @@ namespace Microsoft.Azure.WebJobs.Script.Tests.DependencyInjection
12
11
{
13
12
public class JobHostServiceProviderTests
14
13
{
14
+ private delegate object ServiceFactory ( Type type ) ;
15
+
15
16
[ Fact ]
16
17
public void Dispose_OnJobHostScope_DoesNotDisposeRootSingletonService ( )
17
18
{
@@ -88,6 +89,90 @@ public void Dispose_OnJobHost_DoesNotDisposRootScopedService()
88
89
Assert . False ( rootService . Disposed ) ;
89
90
}
90
91
92
+ [ Fact ]
93
+ public void Scopes_ChildScopeIsIsolated ( )
94
+ {
95
+ using ( new TestScopedEnvironmentVariable ( EnvironmentSettingNames . AzureWebJobsFeatureFlags , ScriptConstants . FeatureFlagEnableEnhancedScopes ) )
96
+ {
97
+ var services = new ServiceCollection ( ) ;
98
+ services . AddScoped < A > ( ) ;
99
+
100
+ var rootScopeFactory = new WebHostServiceProvider ( new ServiceCollection ( ) ) ;
101
+ var jobHostProvider = new JobHostServiceProvider ( services , rootScopeFactory , rootScopeFactory ) ;
102
+
103
+ var a1 = jobHostProvider . GetService < A > ( ) ;
104
+ jobHostProvider . CreateScope ( ) ;
105
+ var a2 = jobHostProvider . GetService < A > ( ) ;
106
+ Assert . NotNull ( a1 ) ;
107
+ Assert . NotNull ( a2 ) ;
108
+ Assert . Same ( a1 , a2 ) ;
109
+ }
110
+ }
111
+
112
+ [ Fact ]
113
+ public void Scopes_Factories ( )
114
+ {
115
+ using ( new TestScopedEnvironmentVariable ( EnvironmentSettingNames . AzureWebJobsFeatureFlags , ScriptConstants . FeatureFlagEnableEnhancedScopes ) )
116
+ {
117
+ IList < IServiceProvider > serviceProviders = new List < IServiceProvider > ( ) ;
118
+
119
+ var services = new ServiceCollection ( ) ;
120
+ services . AddTransient < A > ( p =>
121
+ {
122
+ serviceProviders . Add ( p ) ;
123
+ return new A ( ) ;
124
+ } ) ;
125
+
126
+ var rootScopeFactory = new WebHostServiceProvider ( new ServiceCollection ( ) ) ;
127
+ var jobHostProvider = new JobHostServiceProvider ( services , rootScopeFactory , rootScopeFactory ) ;
128
+
129
+ // Get this service twice.
130
+ // The IServiceProvider passed to the factory should be different because they are separate scopes.
131
+ var scope1 = jobHostProvider . CreateScope ( ) ;
132
+ scope1 . ServiceProvider . GetService < A > ( ) ;
133
+
134
+ var scope2 = jobHostProvider . CreateScope ( ) ;
135
+ scope2 . ServiceProvider . GetService < A > ( ) ;
136
+
137
+ Assert . Equal ( 2 , serviceProviders . Count ) ;
138
+ Assert . NotSame ( serviceProviders [ 0 ] , serviceProviders [ 1 ] ) ;
139
+ }
140
+ }
141
+
142
+ [ Theory ]
143
+ [ InlineData ( "" ) ]
144
+ [ InlineData ( ScriptConstants . FeatureFlagEnableEnhancedScopes ) ]
145
+ public void Scopes_DelegateFactory ( string flag )
146
+ {
147
+ using ( new TestScopedEnvironmentVariable ( EnvironmentSettingNames . AzureWebJobsFeatureFlags , flag ) )
148
+ {
149
+ var services = new ServiceCollection ( ) ;
150
+
151
+ services . AddScoped < A > ( ) ;
152
+ services . AddScoped < ServiceFactory > ( provider => ( type ) => provider . GetRequiredService ( type ) ) ;
153
+
154
+ var rootScopeFactory = new WebHostServiceProvider ( new ServiceCollection ( ) ) ;
155
+ var jobHostProvider = new JobHostServiceProvider ( services , rootScopeFactory , rootScopeFactory ) ;
156
+
157
+ var scope1 = jobHostProvider . CreateScope ( ) ;
158
+ var a1 = scope1 . ServiceProvider . GetService < ServiceFactory > ( ) ( typeof ( A ) ) ;
159
+
160
+ var scope2 = jobHostProvider . CreateScope ( ) ;
161
+ var a2 = scope2 . ServiceProvider . GetService < ServiceFactory > ( ) ( typeof ( A ) ) ;
162
+
163
+ Assert . NotNull ( a1 ) ;
164
+ Assert . NotNull ( a2 ) ;
165
+ Assert . NotSame ( a1 , a2 ) ;
166
+ }
167
+ }
168
+
169
+ private class A
170
+ {
171
+ public A ( )
172
+ {
173
+ }
174
+ }
175
+
91
176
private class TestService : IService , IDisposable
92
177
{
93
178
public bool Disposed { get ; private set ; }
0 commit comments