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