Singleton中的ASP.NET事件处理

时间:2015-03-16 12:11:24

标签: c# asp.net-mvc events event-handling signalr

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

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

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

1 个答案:

答案 0 :(得分:0)

感谢Daniel J.G.

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