From 0ec15ea01d20597d1c8cea7f8df51d26a07d5f87 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Tue, 7 Jul 2020 11:47:19 +0100 Subject: [PATCH] CR: Add ctor overload accepting IComponentActivator --- ...rosoft.AspNetCore.Components.netcoreapp.cs | 1 + .../Components/src/RenderTree/Renderer.cs | 26 ++++++++++++++++--- .../Components/test/RendererTest.cs | 19 +++++++++++++- src/Components/Shared/test/TestRenderer.cs | 6 +++++ 4 files changed, 48 insertions(+), 4 deletions(-) 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; }