2010-02-12 48 views
2

我正在使用一个ASP.NET MVC应用程序的插件系统(松散地基于Rob Connery的MVC店面项目实现)。C#发布静态事件

除了执行插件方法,我还希望允许类提供插件可以订阅的各种事件挂钩。

我出版我的事件,像这样:

 #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."); 
    } 

这是出版的一个很好的和线程安全的方式和订阅这些事件?

任何想法或建议表示赞赏。

感谢 本

回答

3

发射之前将您的事件处理程序的一个局部变量。

ItemAddedEventHandler handler = ItemAdded; 

if (handler != null) 
{ 
    handler(this, EventArgs.Empty) 
} 

检查null和触发事件之间存在竞争条件。无论如何你最好是follow the guidelines

+0

我只是好奇心,因为我想学习一些东西,为什么这有什么不同或更好?你可以更新你的答案,包括为什么? – jsmith

+0

当然,对不起。 – ziya

+0

太好了,谢谢你。看过这篇文章,但错过了关于竞争条件的观点。 –