我在我正在使用的ASP.NET MVC应用程序上使用插件系统(松散地基于Rob Connery的MVC店面项目实现)。
除了执行插件方法之外,我还希望允许类提供插件可以订阅的各种事件挂钩。
我正在发布我的活动:
#region Events
public static event ItemAddedEventHandler ItemAdded;
internal virtual void OnItemAdded(EventArgs e)
{
if (ItemAdded != null)
ItemAdded(this, new EventArgs());
}
public static event LineRemovedEventHandler LineRemoved;
internal virtual void OnLineRemoved(EventArgs e)
{
if (LineRemoved != null)
LineRemoved(this, new EventArgs());
}
#endregion
public delegate void ItemAddedEventHandler(object sender, EventArgs e);
public delegate void LineRemovedEventHandler(object sender, EventArgs e);
一个示例插件:
public EventHooks() {
Cart.ItemAdded += new Cart.ItemAddedEventHandler(Cart_ItemAdded);
Cart.LineRemoved += new Cart.LineRemovedEventHandler(Cart_LineRemoved);
}
void Cart_ItemAdded(object sender, EventArgs e) {
_loggerService.Info("An item was added to the cart.");
}
void Cart_LineRemoved(object sender, EventArgs e) {
_loggerService.Info("A line was removed from the cart.");
}
这是一种发布和订阅这些活动的良好且线程安全的方式吗?
赞赏任何想法或建议。
由于 本
答案 0 :(得分:3)
在解雇之前将你的EventHandler分配给本地var。
ItemAddedEventHandler handler = ItemAdded;
if (handler != null)
{
handler(this, EventArgs.Empty)
}
检查null和触发事件之间存在竞争条件。无论如何,你最好follow the guidelines。