2 votes

C# publication d'événements statiques

Je suis en train d'utiliser un système de plugin sur une application ASP.NET MVC sur laquelle je travaille (inspiré en partie de l'implémentation du projet MVC storefront de Rob Connery).

En plus d'exécuter des méthodes de plugin, je veux également permettre aux classes de fournir divers points d'ancrage d'événements auxquels un plugin peut s'abonner.

Je publie mes événements de la manière suivante :

        #region Événements

    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);

Et un exemple de plugin :

        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("Un article a été ajouté au panier.");
    }

    void Cart_LineRemoved(object sender, EventArgs e) {
        _loggerService.Info("Une ligne a été supprimée du panier.");
    }

Est-ce une bonne manière et sécurisée en termes de thread de publier et de s'abonner à ces événements ?

Toutes réflexions ou suggestions sont les bienvenues.

Merci Ben

3voto

Assignez vos gestionnaires d'événements à une variable locale avant de les déclencher.

ItemAddedEventHandler handler = ItemAdded;

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

Il y a une condition de concurrence entre la vérification de la valeur nulle et le déclenchement de l'événement. Vous feriez mieux de suivre les directives de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X