Skip to content

Commit 0e7409e

Browse files
committed
PR feedback
1 parent 197d527 commit 0e7409e

File tree

3 files changed

+34
-17
lines changed

3 files changed

+34
-17
lines changed

src/Components/Components/src/ComponentFactory.cs

+30-10
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ internal sealed class ComponentFactory
1515
private const BindingFlags _injectablePropertyBindingFlags
1616
= BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
1717

18-
private static readonly ConcurrentDictionary<Type, (Action<IServiceProvider, IComponent> propertyInitializers, ObjectFactory? componentInitializer)> _cachedInitializers = new();
18+
private static readonly ConcurrentDictionary<Type, ComponentInitializer> _cachedInitializers = new();
1919
private readonly IComponentActivator? _componentActivator;
2020

2121
public ComponentFactory(IComponentActivator? componentActivator)
@@ -47,14 +47,11 @@ private static IComponent InstantiateDefault(IServiceProvider serviceProvider, [
4747
throw new ArgumentException($"The type {componentType.FullName} does not implement {nameof(IComponent)}.", nameof(componentType));
4848
}
4949

50-
initializer = (CreatePropertyInitializer(componentType), ActivatorUtilities.CreateFactory(componentType, Type.EmptyTypes));
50+
initializer = new(CreatePropertyInitializer(componentType), ActivatorUtilities.CreateFactory(componentType, Type.EmptyTypes));
5151
_cachedInitializers.TryAdd(componentType, initializer);
5252
}
5353

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);
5855
}
5956

6057
private static IComponent InstantiateWithActivator(IComponentActivator componentActivator, IServiceProvider serviceProvider, [DynamicallyAccessedMembers(Component)] Type componentType)
@@ -74,13 +71,11 @@ private static IComponent InstantiateWithActivator(IComponentActivator component
7471
// still produce the correct result.
7572
if (!_cachedInitializers.TryGetValue(componentType, out var initializer))
7673
{
77-
initializer = (CreatePropertyInitializer(componentType), componentInitializer: null);
74+
initializer = new(CreatePropertyInitializer(componentType));
7875
_cachedInitializers.TryAdd(componentType, initializer);
7976
}
8077

81-
var (propertyInitializer, _) = initializer;
82-
83-
propertyInitializer(serviceProvider, component);
78+
initializer.ActivateProperties(serviceProvider, component);
8479
return component;
8580
}
8681

@@ -124,4 +119,29 @@ void Initialize(IServiceProvider serviceProvider, IComponent component)
124119
}
125120
}
126121
}
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+
}
127147
}

src/Components/Components/src/RenderTree/Renderer.cs

+3
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ public Renderer(IServiceProvider serviceProvider, ILoggerFactory loggerFactory,
8787
throw new ArgumentNullException(nameof(loggerFactory));
8888
}
8989

90+
// Even though IComponentActivator is not marked as nullable, we do allow null because that's how the framework internally indicates
91+
// that we should use default activation logic.
92+
9093
_serviceProvider = serviceProvider;
9194
_logger = loggerFactory.CreateLogger<Renderer>();
9295
_componentFactory = new ComponentFactory(componentActivator);

src/Components/Samples/BlazorServerApp/Pages/FetchData.razor

+1-7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<PageTitle>Weather forecast</PageTitle>
44

55
@using BlazorServerApp.Data
6+
@inject WeatherForecastService ForecastService
67

78
<h1>Weather forecast</h1>
89

@@ -40,13 +41,6 @@ else
4041
@code {
4142
WeatherForecast[]? forecasts;
4243

43-
public FetchData(WeatherForecastService forecastService)
44-
{
45-
ForecastService = forecastService;
46-
}
47-
48-
private WeatherForecastService ForecastService { get; }
49-
5044
protected override async Task OnInitializedAsync()
5145
{
5246
forecasts = await ForecastService.GetForecastAsync(DateTime.Now);

0 commit comments

Comments
 (0)