我正在使用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();
}
但是,每次我将项目添加到存储库时,都会添加新的相同处理程序并将事件处理相乘。
答案 0 :(得分:0)
感谢Daniel J.G.:
&#34;是的,它将是一个不同的处理程序,因为每个请求都会创建并使用一个新的控制器实例。但是,您可以将该方法设置为静态方法或将其移动到其他单个对象中。这应该可以解决您的问题,并且您每次向存储库添加项目时都不需要添加处理程序(这对我来说似乎很奇怪),您可以在某种启动方法中添加一次&#34;