C # публикация статических событий - PullRequest
2 голосов
/ 12 февраля 2010

Я использую систему плагинов в приложении ASP.NET MVC, над которым я работаю (слабо на основе реализации проекта витрины 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.");
    }

Это хороший и надежный способ публикации и подписки на эти события?

Любые мысли или предложения приветствуются.

Спасибо, Бен

1 Ответ

3 голосов
/ 13 февраля 2010

Присвойте своим EventHandler'ам локальную переменную перед их запуском.

ItemAddedEventHandler handler = ItemAdded;

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

Существует условие гонки между проверкой нулевого значения и запуском события. Вам лучше в любом случае следовать указаниям .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...