ASP.NET 单例中的事件处理



我正在使用 ASP.NET MVC4和SignalR创建Web应用程序。我试图为某些游戏类创建存储库。另外,我想在每次添加项目时触发事件。

C#

public class Repository : Dictionary<string, Game>
{
    private static Repository _instance;
    public delegate void AddItemEventHandler(object sender, EventArgs e);
    private AddItemEventHandler handler;
    public event AddItemEventHandler OnAddItem
    {
        add 
        {
            if(handler != null)
            {
                handler -= value;
            }                
            handler += value;
        }
        remove 
        {
            handler -= value;
        }
    }     
    public static Repository Instance 
    {
        get
        {
            if (_instance == null)
            {
                _instance = new Repository();
            }
            return _instance;
        }
    }
    private Repository()
    {}
    public void Add(Game model)
    {
        string key = model.Guid.ToString();
        if (!_instance.ContainsKey(key))
        {
            _instance.Add(key, model);
            if (handler != null)
            {
                handler(this, new EventArgs());
            }                
        }       
    }
}

处理程序将添加到 MVC 操作中:

Repository.Instance.OnAddItem += Repository_OnAddItem;
Repository.Instance.Add(game);

处理程序在其控制器中声明:

void Repository_OnAddItem(object sender, EventArgs e)
    {
        IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<SPSHub>();
        hubContext.Clients.All.addItem();
    }

但是,每次将项目添加到存储库时,都会添加新的相同处理程序并增加事件处理。

感谢Daniel J.G.:

"是的,它将是一个不同的处理程序,因为每个请求都会创建和使用一个新的控制器实例。但是,您可以将该方法设置为静态方法或将其移动到其他单个实例对象中。这应该可以解决您的问题,并且您也不需要每次将项目添加到存储库时都添加处理程序(无论如何这对我来说似乎是一件奇怪的事情),您将在某种启动方法中添加一次。

相关内容

  • 没有找到相关文章

最新更新