@@ -15,8 +15,9 @@ public void InstantiateComponent_CreatesInstance()
15
15
{
16
16
// Arrange
17
17
var componentType = typeof ( EmptyComponent ) ;
18
- var factory = new ComponentFactory ( new DefaultComponentActivator ( ) , new TestRenderer ( ) ) ;
19
-
18
+ var serviceProvider = GetServiceProvider ( ) ;
19
+ var factory = new ComponentFactory ( new DefaultComponentActivator ( serviceProvider ) , new TestRenderer ( ) ) ;
20
+
20
21
// Act
21
22
var instance = factory . InstantiateComponent ( GetServiceProvider ( ) , componentType , null , null ) ;
22
23
@@ -30,8 +31,9 @@ public void InstantiateComponent_CreatesInstance_NonComponent()
30
31
{
31
32
// Arrange
32
33
var componentType = typeof ( List < string > ) ;
33
- var factory = new ComponentFactory ( new DefaultComponentActivator ( ) , new TestRenderer ( ) ) ;
34
-
34
+ var serviceProvider = GetServiceProvider ( ) ;
35
+ var factory = new ComponentFactory ( new DefaultComponentActivator ( serviceProvider ) , new TestRenderer ( ) ) ;
36
+
35
37
// Assert
36
38
var ex = Assert . Throws < ArgumentException > ( ( ) => factory . InstantiateComponent ( GetServiceProvider ( ) , componentType , null , null ) ) ;
37
39
Assert . StartsWith ( $ "The type { componentType . FullName } does not implement { nameof ( IComponent ) } .", ex . Message ) ;
@@ -99,10 +101,11 @@ public void InstantiateComponent_IgnoresPropertiesWithoutInjectAttribute()
99
101
{
100
102
// Arrange
101
103
var componentType = typeof ( ComponentWithNonInjectableProperties ) ;
102
- var factory = new ComponentFactory ( new DefaultComponentActivator ( ) , new TestRenderer ( ) ) ;
104
+ var serviceProvider = GetServiceProvider ( ) ;
105
+ var factory = new ComponentFactory ( new DefaultComponentActivator ( serviceProvider ) , new TestRenderer ( ) ) ;
103
106
104
107
// Act
105
- var instance = factory . InstantiateComponent ( GetServiceProvider ( ) , componentType , null , null ) ;
108
+ var instance = factory . InstantiateComponent ( serviceProvider , componentType , null , null ) ;
106
109
107
110
// Assert
108
111
Assert . NotNull ( instance ) ;
@@ -119,10 +122,11 @@ public void InstantiateComponent_WithNoRenderMode_DoesNotUseRenderModeResolver()
119
122
var componentType = typeof ( ComponentWithInjectProperties ) ;
120
123
var renderer = new RendererWithResolveComponentForRenderMode (
121
124
/* won't be used */ new ComponentWithRenderMode ( ) ) ;
122
- var factory = new ComponentFactory ( new DefaultComponentActivator ( ) , renderer ) ;
125
+ var serviceProvider = GetServiceProvider ( ) ;
126
+ var factory = new ComponentFactory ( new DefaultComponentActivator ( serviceProvider ) , renderer ) ;
123
127
124
128
// Act
125
- var instance = factory . InstantiateComponent ( GetServiceProvider ( ) , componentType , null , null ) ;
129
+ var instance = factory . InstantiateComponent ( serviceProvider , componentType , null , null ) ;
126
130
127
131
// Assert
128
132
Assert . IsType < ComponentWithInjectProperties > ( instance ) ;
@@ -136,11 +140,12 @@ public void InstantiateComponent_WithRenderModeOnComponent_UsesRenderModeResolve
136
140
var resolvedComponent = new ComponentWithInjectProperties ( ) ;
137
141
var componentType = typeof ( ComponentWithRenderMode ) ;
138
142
var renderer = new RendererWithResolveComponentForRenderMode ( resolvedComponent ) ;
139
- var componentActivator = new DefaultComponentActivator ( ) ;
143
+ var serviceProvider = GetServiceProvider ( ) ;
144
+ var componentActivator = new DefaultComponentActivator ( serviceProvider ) ;
140
145
var factory = new ComponentFactory ( componentActivator , renderer ) ;
141
146
142
147
// Act
143
- var instance = ( ComponentWithInjectProperties ) factory . InstantiateComponent ( GetServiceProvider ( ) , componentType , null , 1234 ) ;
148
+ var instance = ( ComponentWithInjectProperties ) factory . InstantiateComponent ( serviceProvider , componentType , null , 1234 ) ;
144
149
145
150
// Assert
146
151
Assert . True ( renderer . ResolverWasCalled ) ;
@@ -167,12 +172,13 @@ public void InstantiateComponent_WithDerivedRenderModeOnDerivedComponent_CausesA
167
172
var resolvedComponent = new ComponentWithInjectProperties ( ) ;
168
173
var componentType = typeof ( DerivedComponentWithRenderMode ) ;
169
174
var renderer = new RendererWithResolveComponentForRenderMode ( resolvedComponent ) ;
170
- var componentActivator = new DefaultComponentActivator ( ) ;
175
+ var serviceProvider = GetServiceProvider ( ) ;
176
+ var componentActivator = new DefaultComponentActivator ( serviceProvider ) ;
171
177
var factory = new ComponentFactory ( componentActivator , renderer ) ;
172
178
173
179
// Act/Assert
174
180
Assert . Throws < AmbiguousMatchException > (
175
- ( ) => factory . InstantiateComponent ( GetServiceProvider ( ) , componentType , null , 1234 ) ) ;
181
+ ( ) => factory . InstantiateComponent ( serviceProvider , componentType , null , 1234 ) ) ;
176
182
}
177
183
178
184
[ Fact ]
@@ -185,11 +191,12 @@ public void InstantiateComponent_WithRenderModeOnCallSite_UsesRenderModeResolver
185
191
var componentType = typeof ( ComponentWithNonInjectableProperties ) ;
186
192
var callSiteRenderMode = new TestRenderMode ( ) ;
187
193
var renderer = new RendererWithResolveComponentForRenderMode ( resolvedComponent ) ;
188
- var componentActivator = new DefaultComponentActivator ( ) ;
194
+ var serviceProvider = GetServiceProvider ( ) ;
195
+ var componentActivator = new DefaultComponentActivator ( serviceProvider ) ;
189
196
var factory = new ComponentFactory ( componentActivator , renderer ) ;
190
197
191
198
// Act
192
- var instance = ( ComponentWithInjectProperties ) factory . InstantiateComponent ( GetServiceProvider ( ) , componentType , callSiteRenderMode , 1234 ) ;
199
+ var instance = ( ComponentWithInjectProperties ) factory . InstantiateComponent ( serviceProvider , componentType , callSiteRenderMode , 1234 ) ;
193
200
194
201
// Assert
195
202
Assert . Same ( resolvedComponent , instance ) ;
@@ -207,7 +214,8 @@ public void InstantiateComponent_WithRenderModeOnComponentAndCallSite_Throws()
207
214
var resolvedComponent = new ComponentWithInjectProperties ( ) ;
208
215
var componentType = typeof ( ComponentWithRenderMode ) ;
209
216
var renderer = new RendererWithResolveComponentForRenderMode ( resolvedComponent ) ;
210
- var componentActivator = new DefaultComponentActivator ( ) ;
217
+ var serviceProvider = GetServiceProvider ( ) ;
218
+ var componentActivator = new DefaultComponentActivator ( serviceProvider ) ;
211
219
var factory = new ComponentFactory ( componentActivator , renderer ) ;
212
220
213
221
// Even though the two rendermodes are literally the same object, we don't allow specifying any nonnull
@@ -220,6 +228,28 @@ public void InstantiateComponent_WithRenderModeOnComponentAndCallSite_Throws()
220
228
Assert . Equal ( $ "The component type '{ componentType } ' has a fixed rendermode of '{ typeof ( TestRenderMode ) } ', so it is not valid to specify any rendermode when using this component.", ex . Message ) ;
221
229
}
222
230
231
+ [ Fact ]
232
+ public void InstantiateComponent_CreatesInstance_WithTypeActivation ( )
233
+ {
234
+ // Arrange
235
+ var serviceProvider = GetServiceProvider ( ) ;
236
+ var componentType = typeof ( ComponentWithConstructorInjection ) ;
237
+ var resolvedComponent = new ComponentWithInjectProperties ( ) ;
238
+ var renderer = new RendererWithResolveComponentForRenderMode ( resolvedComponent ) ;
239
+ var defaultComponentActivator = new DefaultComponentActivator ( serviceProvider ) ;
240
+ var factory = new ComponentFactory ( defaultComponentActivator , renderer ) ;
241
+
242
+ // Act
243
+ var instance = factory . InstantiateComponent ( serviceProvider , componentType , null , null ) ;
244
+
245
+ // Assert
246
+ Assert . NotNull ( instance ) ;
247
+ var component = Assert . IsType < ComponentWithConstructorInjection > ( instance ) ;
248
+ Assert . NotNull ( component . Property1 ) ;
249
+ Assert . NotNull ( component . Property2 ) ;
250
+ Assert . NotNull ( component . Property3 ) ; // Property injection should still work.
251
+ }
252
+
223
253
private const string KeyedServiceKey = "my-keyed-service" ;
224
254
225
255
private static IServiceProvider GetServiceProvider ( )
@@ -292,6 +322,31 @@ public Task SetParametersAsync(ParameterView parameters)
292
322
}
293
323
}
294
324
325
+ public class ComponentWithConstructorInjection : IComponent
326
+ {
327
+ public ComponentWithConstructorInjection ( TestService1 property1 , TestService2 property2 )
328
+ {
329
+ Property1 = property1 ;
330
+ Property2 = property2 ;
331
+ }
332
+
333
+ public TestService1 Property1 { get ; }
334
+ public TestService2 Property2 { get ; }
335
+
336
+ [ Inject ]
337
+ public TestService2 Property3 { get ; set ; }
338
+
339
+ public void Attach ( RenderHandle renderHandle )
340
+ {
341
+ throw new NotImplementedException ( ) ;
342
+ }
343
+
344
+ public Task SetParametersAsync ( ParameterView parameters )
345
+ {
346
+ throw new NotImplementedException ( ) ;
347
+ }
348
+ }
349
+
295
350
private class DerivedComponent : ComponentWithInjectProperties
296
351
{
297
352
public new TestService2 Property4 { get ; set ; }
0 commit comments