diff --git a/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRenderer.cs b/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRenderer.cs
index 550c019d1e..675fc29e3e 100644
--- a/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRenderer.cs
+++ b/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRenderer.cs
@@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Blazor.Browser.Rendering
/// The to use when initializing components.
public BrowserRenderer(IServiceProvider serviceProvider): base(serviceProvider)
{
- _browserRendererId = BrowserRendererRegistry.Add(this);
+ _browserRendererId = BrowserRendererRegistry.CurrentUserInstance.Add(this);
}
internal void DispatchBrowserEvent(int componentId, int eventHandlerId, UIEventArgs eventArgs)
@@ -79,7 +79,7 @@ namespace Microsoft.AspNetCore.Blazor.Browser.Rendering
///
public void Dispose()
{
- BrowserRendererRegistry.TryRemove(_browserRendererId);
+ BrowserRendererRegistry.CurrentUserInstance.TryRemove(_browserRendererId);
}
///
diff --git a/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRendererEventDispatcher.cs b/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRendererEventDispatcher.cs
index f005c4f96b..01ec744b84 100644
--- a/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRendererEventDispatcher.cs
+++ b/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRendererEventDispatcher.cs
@@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Blazor.Browser.Rendering
BrowserEventDescriptor eventDescriptor, string eventArgsJson)
{
var eventArgs = ParseEventArgsJson(eventDescriptor.EventArgsType, eventArgsJson);
- var browserRenderer = BrowserRendererRegistry.Find(eventDescriptor.BrowserRendererId);
+ var browserRenderer = BrowserRendererRegistry.CurrentUserInstance.Find(eventDescriptor.BrowserRendererId);
browserRenderer.DispatchBrowserEvent(
eventDescriptor.ComponentId,
eventDescriptor.EventHandlerId,
diff --git a/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRendererRegistry.cs b/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRendererRegistry.cs
index 805c772d44..a0aa2a3860 100644
--- a/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRendererRegistry.cs
+++ b/src/Microsoft.AspNetCore.Blazor.Browser/Rendering/BrowserRendererRegistry.cs
@@ -1,4 +1,4 @@
-// Copyright (c) .NET Foundation. All rights reserved.
+// 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.Collections.Generic;
@@ -12,18 +12,26 @@ namespace Microsoft.AspNetCore.Blazor.Browser.Rendering
/// their associated component instances aren't GCed when events may still
/// be received for them.
///
- internal static class BrowserRendererRegistry
+ internal class BrowserRendererRegistry
{
- private static int _nextId;
- private static IDictionary _browserRenderers
+ private int _nextId;
+ private IDictionary _browserRenderers
= new Dictionary();
+ /// TODO: Don't have just one global static instance.
+ /// For multi-user scenarios, we need the current instance to be distinct for each user,
+ /// and ensure it's always set to that user's value whenever there are incoming JS interop
+ /// calls. We could store the value in the IServiceProvider but then we still need some way
+ /// of reaching the current user's IServiceProvider inside calls to .NET from JS interop.
+ internal static BrowserRendererRegistry CurrentUserInstance { get; }
+ = new BrowserRendererRegistry();
+
///
/// Adds the and gets a unique identifier for it.
///
///
/// A unique identifier for the .
- public static int Add(BrowserRenderer browserRenderer)
+ public int Add(BrowserRenderer browserRenderer)
{
lock (_browserRenderers)
{
@@ -39,7 +47,7 @@ namespace Microsoft.AspNetCore.Blazor.Browser.Rendering
///
/// The identifier of the instance to be returned.
/// The corresponding instance.
- public static BrowserRenderer Find(int browserRendererId)
+ public BrowserRenderer Find(int browserRendererId)
{
lock (_browserRenderers)
{
@@ -52,7 +60,7 @@ namespace Microsoft.AspNetCore.Blazor.Browser.Rendering
///
/// The identifier of the to remove.
/// if the was present; otherwise .
- public static bool TryRemove(int browserRendererId)
+ public bool TryRemove(int browserRendererId)
{
lock (_browserRenderers)
{