对于服务器端Blazor项目,我创建了一个小类,该类收集数组中的弹出消息(祝酒),并在此列表更改时发出事件,以便组件可以收听并显示消息。
在另一个项目中,此方法工作正常,但在我的最新项目中,此服务以某种方式泄漏给其他用户,因此每个人都收到相同的弹出消息。好像作用域服务变成了单例。
服务代码:
public class PopupMessageService
{
public static event Action<List<PopupMessage>>? OnChange;
private readonly List<PopupMessage> _messages = new List<PopupMessage>();
public void ShowMessage(PopupMessage message)
{
_messages.Add(message);
var timer = new Timer(3000);
timer.Elapsed += RemoveFirst;
timer.AutoReset = false;
timer.Start();
OnChange?.Invoke(_messages);
}
private void RemoveFirst(object source, ElapsedEventArgs args)
{
if (_messages.Count == 0)
{
return;
}
_messages.RemoveAt(0);
OnChange?.Invoke(_messages);
}
}
在Startup.cs
中:
services.AddScoped<PopupMessageService>();
在组件内部的用法:
@inject PopupMessageService PopupMessageService
PopupMessageService.ShowMessage(new ViewServices.PopupMessage
{
Message = "Changes saved!",
MessageType = ViewServices.PopupMessage.Type.Success
});
在显示消息的组件内部:
protected override void OnInitialized()
{
PopupMessageService.OnChange += HandleMessagesChanged;
}
所以我的问题是:我该如何调试为什么每个连接的用户都选择PopupMessageService.OnChange
?也许有人可以发现代码问题?