Skip to content

Commit 0ec15ea

Browse files
CR: Add ctor overload accepting IComponentActivator
1 parent 9e365f4 commit 0ec15ea

File tree

4 files changed

+47
-3
lines changed

4 files changed

+47
-3
lines changed

src/Components/Components/ref/Microsoft.AspNetCore.Components.netcoreapp.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,7 @@ public readonly partial struct RenderBatch
477477
public abstract partial class Renderer : System.IDisposable
478478
{
479479
public Renderer(System.IServiceProvider serviceProvider, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) { }
480+
public Renderer(System.IServiceProvider serviceProvider, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, Microsoft.AspNetCore.Components.IComponentActivator componentActivator) { }
480481
public abstract Microsoft.AspNetCore.Components.Dispatcher Dispatcher { get; }
481482
protected internal Microsoft.AspNetCore.Components.ElementReferenceContext? ElementReferenceContext { [System.Runtime.CompilerServices.CompilerGeneratedAttribute] get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute] protected set { } }
482483
public event System.UnhandledExceptionEventHandler UnhandledSynchronizationException { add { } remove { } }

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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,18 @@ public event UnhandledExceptionEventHandler UnhandledSynchronizationException
5959
/// <param name="serviceProvider">The <see cref="IServiceProvider"/> to be used when initializing components.</param>
6060
/// <param name="loggerFactory">The <see cref="ILoggerFactory"/>.</param>
6161
public Renderer(IServiceProvider serviceProvider, ILoggerFactory loggerFactory)
62+
: this(serviceProvider, loggerFactory, GetComponentActivatorOrDefault(serviceProvider))
63+
{
64+
// This overload is provided for back-compatibility
65+
}
66+
67+
/// <summary>
68+
/// Constructs an instance of <see cref="Renderer"/>.
69+
/// </summary>
70+
/// <param name="serviceProvider">The <see cref="IServiceProvider"/> to be used when initializing components.</param>
71+
/// <param name="loggerFactory">The <see cref="ILoggerFactory"/>.</param>
72+
/// <param name="componentActivator">The <see cref="IComponentActivator"/>.</param>
73+
public Renderer(IServiceProvider serviceProvider, ILoggerFactory loggerFactory, IComponentActivator componentActivator)
6274
{
6375
if (serviceProvider is null)
6476
{
@@ -70,12 +82,20 @@ public Renderer(IServiceProvider serviceProvider, ILoggerFactory loggerFactory)
7082
throw new ArgumentNullException(nameof(loggerFactory));
7183
}
7284

85+
if (componentActivator is null)
86+
{
87+
throw new ArgumentNullException(nameof(componentActivator));
88+
}
89+
7390
_serviceProvider = serviceProvider;
7491
_logger = loggerFactory.CreateLogger<Renderer>();
92+
_componentFactory = new ComponentFactory(componentActivator);
93+
}
7594

76-
var componentActivator = serviceProvider.GetService<IComponentActivator>()
95+
private static IComponentActivator GetComponentActivatorOrDefault(IServiceProvider serviceProvider)
96+
{
97+
return serviceProvider.GetService<IComponentActivator>()
7798
?? DefaultComponentActivator.Instance;
78-
_componentFactory = new ComponentFactory(componentActivator);
7999
}
80100

81101
/// <summary>

src/Components/Components/test/RendererTest.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3734,7 +3734,24 @@ public void CannotAccessParameterViewAfterSynchronousReturn()
37343734
}
37353735

37363736
[Fact]
3737-
public void CanUseCustomComponentActivator()
3737+
public void CanUseCustomComponentActivatorFromConstructorParameter()
3738+
{
3739+
// Arrange
3740+
var serviceProvider = new TestServiceProvider();
3741+
var componentActivator = new TestComponentActivator<MessageComponent>();
3742+
var renderer = new TestRenderer(serviceProvider, componentActivator);
3743+
3744+
// Act: Ask for TestComponent
3745+
var suppliedComponent = renderer.InstantiateComponent<TestComponent>();
3746+
3747+
// Assert: We actually receive MessageComponent
3748+
Assert.IsType<MessageComponent>(suppliedComponent);
3749+
Assert.Collection(componentActivator.RequestedComponentTypes,
3750+
requestedType => Assert.Equal(typeof(TestComponent), requestedType));
3751+
}
3752+
3753+
[Fact]
3754+
public void CanUseCustomComponentActivatorFromServiceProvider()
37383755
{
37393756
// Arrange
37403757
var serviceProvider = new TestServiceProvider();

src/Components/Shared/test/TestRenderer.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ public TestRenderer(IServiceProvider serviceProvider) : base(serviceProvider, Nu
2929
Dispatcher = Dispatcher.CreateDefault();
3030
}
3131

32+
public TestRenderer(IServiceProvider serviceProvider, IComponentActivator componentActivator)
33+
: base(serviceProvider, NullLoggerFactory.Instance, componentActivator)
34+
{
35+
Dispatcher = Dispatcher.CreateDefault();
36+
}
37+
3238
public override Dispatcher Dispatcher { get; }
3339

3440
public Action OnExceptionHandled { get; set; }

0 commit comments

Comments
 (0)