2010-02-12 58 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

太好了,謝謝你。看過這篇文章,但錯過了關於競爭條件的觀點。 –