2 votes

Collection d'événements

J'utilise les événements comme un modèle d'éditeur/abonné en C#. Cependant, je ne sais pas, au moment de la conception, combien d'éditeurs mon programme utilisera. Je voudrais ajouter dynamiquement des événements soit à une classe directement, soit, plus plausiblement, à une collection/dictionnaire contenant les événements.

L'un ou l'autre de ces scénarios est-il possible en utilisant C# ?

1voto

afeygin Points 617

Créez un médiateur sur lequel vos éditeurs publient et auquel vos abonnés s'abonnent. Par exemple :

public class Mediator
{
    public static readonly Mediator Current = new Mediator();
    public event EventHandler<EventArgs> EventRaised;
    public void RaiseEvent(object sender, EventArgs eventArgs)
    {
        if (EventRaised!=null) 
            EventRaised(sender, eventArgs);
    }
}
public class PublisherEventArgs : EventArgs
{
    public string SomeData { get; set; }
}
public class Publisher
{
    public void Publish(string data)
    {
        Mediator.Current.RaiseEvent(this, new PublisherEventArgs() { SomeData = data} );
    }
}
public class Subscriber
{
    public Subscriber()
    {
        Mediator.Current.EventRaised += HandlePublishedEvent;
    }

    private void HandlePublishedEvent(object sender, EventArgs e)
    {
        if(e is PublisherEventArgs)
        {
            string data = ((PublisherEventArgs)e).SomeData;
            // todo: do something here
        }
    }
}

Assurez-vous d'implémenter IDisposable sur votre abonné (ce n'est pas le cas dans mon exemple) afin qu'il se désabonne du Mediator lors de la disposition.

0voto

casperOne Points 49736

Pour ce faire, vous devez déconnecter l'événement de sa source. Cela se fait généralement avec un agrégateur d'événements ; il gère les clients qui veulent publier des événements ainsi que ceux qui veulent s'abonner à des événements. Tout ceci découple les éditeurs des auditeurs et vous permet de faire ce que vous décrivez.

Prism dispose d'un agrégateur d'événements prêt à l'emploi que vous pouvez utiliser sous la forme de l'outil IEventAggregator interface.

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