范围服务变为单例。如何调试?

时间:2020-04-20 09:23:02

标签: c# .net-core blazor blazor-server-side

对于服务器端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?也许有人可以发现代码问题?

0 个答案:

没有答案