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();
+ }
+}