diff --git a/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRenderer.cs b/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRenderer.cs index 2752515df9..15bc3a06cc 100644 --- a/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRenderer.cs +++ b/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRenderer.cs @@ -2,11 +2,11 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNetCore.Blazor.Browser.Interop; +using Microsoft.AspNetCore.Blazor.Browser.Services; using Microsoft.AspNetCore.Blazor.Components; using Microsoft.AspNetCore.Blazor.Rendering; using Microsoft.AspNetCore.Blazor.RenderTree; using System; -using System.Collections.Generic; namespace Microsoft.AspNetCore.Blazor.Browser.Rendering { @@ -21,7 +21,15 @@ namespace Microsoft.AspNetCore.Blazor.Browser.Rendering /// /// Constructs an instance of . /// - public BrowserRenderer() + public BrowserRenderer(): this(new DefaultBrowserServiceProvider()) + { + } + + /// + /// Constructs an instance of . + /// + /// The to use when initializing components. + public BrowserRenderer(IServiceProvider serviceProvider): base(serviceProvider) { _browserRendererId = BrowserRendererRegistry.Add(this); } diff --git a/src/Microsoft.AspNetCore.Blazor.Browser/Services/DefaultBrowserServiceProvider.cs b/src/Microsoft.AspNetCore.Blazor.Browser/Services/DefaultBrowserServiceProvider.cs new file mode 100644 index 0000000000..6d1780b9d5 --- /dev/null +++ b/src/Microsoft.AspNetCore.Blazor.Browser/Services/DefaultBrowserServiceProvider.cs @@ -0,0 +1,20 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNetCore.Blazor.Browser.Services +{ + /// + /// An implementation of configured with + /// default services suitable for use in a browser environment. + /// + public class DefaultBrowserServiceProvider : IServiceProvider + { + /// + public object GetService(Type serviceType) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/Microsoft.AspNetCore.Blazor/Components/ComponentFactory.cs b/src/Microsoft.AspNetCore.Blazor/Components/ComponentFactory.cs new file mode 100644 index 0000000000..780a510b9e --- /dev/null +++ b/src/Microsoft.AspNetCore.Blazor/Components/ComponentFactory.cs @@ -0,0 +1,36 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNetCore.Blazor.Components +{ + internal class ComponentFactory + { + private readonly IServiceProvider _serviceProvider; + + public ComponentFactory(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider + ?? throw new ArgumentNullException(nameof(serviceProvider)); + } + + public IComponent InstantiateComponent(Type componentType) + { + if (!typeof(IComponent).IsAssignableFrom(componentType)) + { + throw new ArgumentException($"The type {componentType.FullName} does not " + + $"implement {nameof(IComponent)}.", nameof(componentType)); + } + + var instance = (IComponent)Activator.CreateInstance(componentType); + PerformPropertyInjection(instance); + return instance; + } + + private void PerformPropertyInjection(IComponent instance) + { + // TODO + } + } +} diff --git a/src/Microsoft.AspNetCore.Blazor/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Blazor/Properties/AssemblyInfo.cs index dd7d9672c0..e25c100011 100644 --- a/src/Microsoft.AspNetCore.Blazor/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNetCore.Blazor/Properties/AssemblyInfo.cs @@ -2,3 +2,4 @@ [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Blazor.Test")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Blazor.Browser.Test")] +[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Blazor.Build.Test")] diff --git a/src/Microsoft.AspNetCore.Blazor/Rendering/Renderer.cs b/src/Microsoft.AspNetCore.Blazor/Rendering/Renderer.cs index e752c85e3b..b758382e45 100644 --- a/src/Microsoft.AspNetCore.Blazor/Rendering/Renderer.cs +++ b/src/Microsoft.AspNetCore.Blazor/Rendering/Renderer.cs @@ -14,6 +14,7 @@ namespace Microsoft.AspNetCore.Blazor.Rendering /// public abstract class Renderer { + private readonly ComponentFactory _componentFactory; private int _nextComponentId = 0; // TODO: change to 'long' when Mono .NET->JS interop supports it private readonly Dictionary _componentStateById = new Dictionary(); @@ -25,20 +26,22 @@ namespace Microsoft.AspNetCore.Blazor.Rendering private readonly Dictionary _eventHandlersById = new Dictionary(); + /// + /// Constructs an instance of . + /// + /// The to be used when initialising components. + public Renderer(IServiceProvider serviceProvider) + { + _componentFactory = new ComponentFactory(serviceProvider); + } + /// /// Constructs a new component of the specified type. /// /// The type of the component to instantiate. /// The component instance. protected IComponent InstantiateComponent(Type componentType) - { - if (!typeof(IComponent).IsAssignableFrom(componentType)) - { - throw new ArgumentException($"Must implement {nameof(IComponent)}", nameof(componentType)); - } - - return (IComponent)Activator.CreateInstance(componentType); - } + => _componentFactory.InstantiateComponent(componentType); /// /// Associates the with the , assigning diff --git a/test/Microsoft.AspNetCore.Blazor.Build.Test/Microsoft.AspNetCore.Blazor.Build.Test.csproj b/test/Microsoft.AspNetCore.Blazor.Build.Test/Microsoft.AspNetCore.Blazor.Build.Test.csproj index acc88b16f3..b83f4d7e36 100644 --- a/test/Microsoft.AspNetCore.Blazor.Build.Test/Microsoft.AspNetCore.Blazor.Build.Test.csproj +++ b/test/Microsoft.AspNetCore.Blazor.Build.Test/Microsoft.AspNetCore.Blazor.Build.Test.csproj @@ -18,7 +18,7 @@ - + diff --git a/test/Microsoft.AspNetCore.Blazor.Build.Test/RazorCompilerTest.cs b/test/Microsoft.AspNetCore.Blazor.Build.Test/RazorCompilerTest.cs index f552281240..59bb95983c 100644 --- a/test/Microsoft.AspNetCore.Blazor.Build.Test/RazorCompilerTest.cs +++ b/test/Microsoft.AspNetCore.Blazor.Build.Test/RazorCompilerTest.cs @@ -745,6 +745,10 @@ namespace Microsoft.AspNetCore.Blazor.Build.Test private class TestRenderer : Renderer { + public TestRenderer() : base(new TestServiceProvider()) + { + } + public RenderTreeFrame[] LatestBatchReferenceFrames { get; private set; } public void AttachComponent(IComponent component) diff --git a/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeBuilderTest.cs b/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeBuilderTest.cs index b7ad4d0a0f..aa111caef1 100644 --- a/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeBuilderTest.cs +++ b/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeBuilderTest.cs @@ -396,6 +396,10 @@ namespace Microsoft.AspNetCore.Blazor.Test private class TestRenderer : Renderer { + public TestRenderer() : base(new TestServiceProvider()) + { + } + protected override void UpdateDisplay(RenderBatch renderBatch) => throw new NotImplementedException(); } diff --git a/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffBuilderTest.cs b/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffBuilderTest.cs index bb215cb513..46479a831e 100644 --- a/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffBuilderTest.cs +++ b/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffBuilderTest.cs @@ -922,6 +922,10 @@ namespace Microsoft.AspNetCore.Blazor.Test private class FakeRenderer : Renderer { + public FakeRenderer() : base(new TestServiceProvider()) + { + } + protected override void UpdateDisplay(RenderBatch renderBatch) { } diff --git a/test/Microsoft.AspNetCore.Blazor.Test/RendererTest.cs b/test/Microsoft.AspNetCore.Blazor.Test/RendererTest.cs index aa2be87106..ee9fc6088d 100644 --- a/test/Microsoft.AspNetCore.Blazor.Test/RendererTest.cs +++ b/test/Microsoft.AspNetCore.Blazor.Test/RendererTest.cs @@ -865,6 +865,10 @@ namespace Microsoft.AspNetCore.Blazor.Test private class NoOpRenderer : Renderer { + public NoOpRenderer() : base(new TestServiceProvider()) + { + } + public new int AssignComponentId(IComponent component) => base.AssignComponentId(component); diff --git a/test/shared/TestRenderer.cs b/test/shared/TestRenderer.cs index 8c652d6bd4..41e334d6b3 100644 --- a/test/shared/TestRenderer.cs +++ b/test/shared/TestRenderer.cs @@ -11,6 +11,10 @@ namespace Microsoft.AspNetCore.Blazor.Test.Helpers { public class TestRenderer : Renderer { + public TestRenderer(): base(new TestServiceProvider()) + { + } + public List Batches { get; } = new List(); diff --git a/test/shared/TestServiceProvider.cs b/test/shared/TestServiceProvider.cs new file mode 100644 index 0000000000..7903a45cf0 --- /dev/null +++ b/test/shared/TestServiceProvider.cs @@ -0,0 +1,12 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNetCore.Blazor.Test.Helpers +{ + public class TestServiceProvider : IServiceProvider + { + public object GetService(Type serviceType) => throw new NotImplementedException(); + } +}