@@ -15,7 +15,7 @@ internal sealed class ComponentFactory
15
15
private const BindingFlags _injectablePropertyBindingFlags
16
16
= BindingFlags . Instance | BindingFlags . Public | BindingFlags . NonPublic ;
17
17
18
- private static readonly ConcurrentDictionary < Type , ( Action < IServiceProvider , IComponent > propertyInitializers , ObjectFactory ? componentInitializer ) > _cachedInitializers = new ( ) ;
18
+ private static readonly ConcurrentDictionary < Type , ComponentInitializer > _cachedInitializers = new ( ) ;
19
19
private readonly IComponentActivator ? _componentActivator ;
20
20
21
21
public ComponentFactory ( IComponentActivator ? componentActivator )
@@ -47,14 +47,11 @@ private static IComponent InstantiateDefault(IServiceProvider serviceProvider, [
47
47
throw new ArgumentException ( $ "The type { componentType . FullName } does not implement { nameof ( IComponent ) } .", nameof ( componentType ) ) ;
48
48
}
49
49
50
- initializer = ( CreatePropertyInitializer ( componentType ) , ActivatorUtilities . CreateFactory ( componentType , Type . EmptyTypes ) ) ;
50
+ initializer = new ( CreatePropertyInitializer ( componentType ) , ActivatorUtilities . CreateFactory ( componentType , Type . EmptyTypes ) ) ;
51
51
_cachedInitializers . TryAdd ( componentType , initializer ) ;
52
52
}
53
53
54
- var ( propertyInitializer , componentInitializer ) = initializer ;
55
- var component = ( IComponent ) componentInitializer ! . Invoke ( serviceProvider , Array . Empty < object ? > ( ) ) ;
56
- propertyInitializer ( serviceProvider , component ) ;
57
- return component ;
54
+ return initializer . CreateDefault ( serviceProvider ) ;
58
55
}
59
56
60
57
private static IComponent InstantiateWithActivator ( IComponentActivator componentActivator , IServiceProvider serviceProvider , [ DynamicallyAccessedMembers ( Component ) ] Type componentType )
@@ -74,13 +71,11 @@ private static IComponent InstantiateWithActivator(IComponentActivator component
74
71
// still produce the correct result.
75
72
if ( ! _cachedInitializers . TryGetValue ( componentType , out var initializer ) )
76
73
{
77
- initializer = ( CreatePropertyInitializer ( componentType ) , componentInitializer : null ) ;
74
+ initializer = new ( CreatePropertyInitializer ( componentType ) ) ;
78
75
_cachedInitializers . TryAdd ( componentType , initializer ) ;
79
76
}
80
77
81
- var ( propertyInitializer , _) = initializer ;
82
-
83
- propertyInitializer ( serviceProvider , component ) ;
78
+ initializer . ActivateProperties ( serviceProvider , component ) ;
84
79
return component ;
85
80
}
86
81
@@ -124,4 +119,29 @@ void Initialize(IServiceProvider serviceProvider, IComponent component)
124
119
}
125
120
}
126
121
}
122
+
123
+ private readonly struct ComponentInitializer
124
+ {
125
+ private readonly Action < IServiceProvider , IComponent > _propertyInitializer ;
126
+
127
+ private readonly ObjectFactory ? _componentFactory ;
128
+
129
+ public ComponentInitializer ( Action < IServiceProvider , IComponent > propertyInitializer , ObjectFactory ? componentFactory = null )
130
+ {
131
+ _propertyInitializer = propertyInitializer ;
132
+ _componentFactory = componentFactory ;
133
+ }
134
+
135
+ public IComponent CreateDefault ( IServiceProvider serviceProvider )
136
+ {
137
+ var component = ( IComponent ) _componentFactory ! ( serviceProvider , Array . Empty < object ? > ( ) ) ;
138
+ ActivateProperties ( serviceProvider , component ) ;
139
+ return component ;
140
+ }
141
+
142
+ public void ActivateProperties ( IServiceProvider serviceProvider , IComponent component )
143
+ {
144
+ _propertyInitializer ( serviceProvider , component ) ;
145
+ }
146
+ }
127
147
}
0 commit comments