diff --git a/src/Components/Components/ref/Microsoft.AspNetCore.Components.netcoreapp.cs b/src/Components/Components/ref/Microsoft.AspNetCore.Components.netcoreapp.cs
index 4575742449..77a0e3637b 100644
--- a/src/Components/Components/ref/Microsoft.AspNetCore.Components.netcoreapp.cs
+++ b/src/Components/Components/ref/Microsoft.AspNetCore.Components.netcoreapp.cs
@@ -477,6 +477,7 @@ namespace Microsoft.AspNetCore.Components.RenderTree
public abstract partial class Renderer : System.IDisposable
{
public Renderer(System.IServiceProvider serviceProvider, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) { }
+ public Renderer(System.IServiceProvider serviceProvider, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, Microsoft.AspNetCore.Components.IComponentActivator componentActivator) { }
public abstract Microsoft.AspNetCore.Components.Dispatcher Dispatcher { get; }
protected internal Microsoft.AspNetCore.Components.ElementReferenceContext? ElementReferenceContext { [System.Runtime.CompilerServices.CompilerGeneratedAttribute] get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute] protected set { } }
public event System.UnhandledExceptionEventHandler UnhandledSynchronizationException { add { } remove { } }
diff --git a/src/Components/Components/src/RenderTree/Renderer.cs b/src/Components/Components/src/RenderTree/Renderer.cs
index ca67d48f9b..446243201f 100644
--- a/src/Components/Components/src/RenderTree/Renderer.cs
+++ b/src/Components/Components/src/RenderTree/Renderer.cs
@@ -59,6 +59,18 @@ namespace Microsoft.AspNetCore.Components.RenderTree
/// The to be used when initializing components.
/// The .
public Renderer(IServiceProvider serviceProvider, ILoggerFactory loggerFactory)
+ : this(serviceProvider, loggerFactory, GetComponentActivatorOrDefault(serviceProvider))
+ {
+ // This overload is provided for back-compatibility
+ }
+
+ ///
+ /// Constructs an instance of .
+ ///
+ /// The to be used when initializing components.
+ /// The .
+ /// The .
+ public Renderer(IServiceProvider serviceProvider, ILoggerFactory loggerFactory, IComponentActivator componentActivator)
{
if (serviceProvider is null)
{
@@ -70,14 +82,22 @@ namespace Microsoft.AspNetCore.Components.RenderTree
throw new ArgumentNullException(nameof(loggerFactory));
}
+ if (componentActivator is null)
+ {
+ throw new ArgumentNullException(nameof(componentActivator));
+ }
+
_serviceProvider = serviceProvider;
_logger = loggerFactory.CreateLogger();
-
- var componentActivator = serviceProvider.GetService()
- ?? DefaultComponentActivator.Instance;
_componentFactory = new ComponentFactory(componentActivator);
}
+ private static IComponentActivator GetComponentActivatorOrDefault(IServiceProvider serviceProvider)
+ {
+ return serviceProvider.GetService()
+ ?? DefaultComponentActivator.Instance;
+ }
+
///
/// Gets the associated with this .
///
diff --git a/src/Components/Components/test/RendererTest.cs b/src/Components/Components/test/RendererTest.cs
index 2afaf99650..07022b2edf 100644
--- a/src/Components/Components/test/RendererTest.cs
+++ b/src/Components/Components/test/RendererTest.cs
@@ -3734,7 +3734,24 @@ namespace Microsoft.AspNetCore.Components.Test
}
[Fact]
- public void CanUseCustomComponentActivator()
+ public void CanUseCustomComponentActivatorFromConstructorParameter()
+ {
+ // Arrange
+ var serviceProvider = new TestServiceProvider();
+ var componentActivator = new TestComponentActivator();
+ var renderer = new TestRenderer(serviceProvider, componentActivator);
+
+ // Act: Ask for TestComponent
+ var suppliedComponent = renderer.InstantiateComponent();
+
+ // Assert: We actually receive MessageComponent
+ Assert.IsType(suppliedComponent);
+ Assert.Collection(componentActivator.RequestedComponentTypes,
+ requestedType => Assert.Equal(typeof(TestComponent), requestedType));
+ }
+
+ [Fact]
+ public void CanUseCustomComponentActivatorFromServiceProvider()
{
// Arrange
var serviceProvider = new TestServiceProvider();
diff --git a/src/Components/Shared/test/TestRenderer.cs b/src/Components/Shared/test/TestRenderer.cs
index 346ae4a417..418eb7a56e 100644
--- a/src/Components/Shared/test/TestRenderer.cs
+++ b/src/Components/Shared/test/TestRenderer.cs
@@ -29,6 +29,12 @@ namespace Microsoft.AspNetCore.Components.Test.Helpers
Dispatcher = Dispatcher.CreateDefault();
}
+ public TestRenderer(IServiceProvider serviceProvider, IComponentActivator componentActivator)
+ : base(serviceProvider, NullLoggerFactory.Instance, componentActivator)
+ {
+ Dispatcher = Dispatcher.CreateDefault();
+ }
+
public override Dispatcher Dispatcher { get; }
public Action OnExceptionHandled { get; set; }