Question

Je veux faire un bus d'événements très simple qui permet à tout client de souscrire à un type particulier d'événement et quand tout éditeur pousse un événement sur le bus en utilisant la méthode EventBus.PushEvent() que les clients qui ont souscrit à ce type d'événement particulier auront l'événement.

J'utilise C # et .NET 2.0.

Était-ce utile?

La solution 4

J'ai trouvé message générique Bus . Il est une classe simple.

Autres conseils

Messenger minuscule est un bon choix, je l'ai utilisé dans un projet en direct pendant 2,5 ans. Voici quelques exemples de code du Wiki (lien ci-dessous):

Edition

messageHub.Publish(new MyMessage());

abonner

messageHub.Subscribe<MyMessage>((m) => { MessageBox.Show("Message Received!"); });
messageHub.Subscribe<MyMessageAgain>((m) => { MessageBox.Show("Message Received!"); }, (m) => m.Content == "Testing");

Le code est sur GitHub: https://github.com/grumpydev/TinyMessenger

Le Wiki est ici: https://github.com/grumpydev/TinyMessenger/wiki

Il a un paquet Nuget aussi

Install-Package TinyMessenger

Un autre, inspiré par EventBus pour Android, mais beaucoup plus simple:

public class EventBus
{
    public static EventBus Instance { get { return instance ?? (instance = new EventBus()); } }

    public void Register(object listener)
    {
        if (!listeners.Any(l => l.Listener == listener))
            listeners.Add(new EventListenerWrapper(listener));
    }

    public void Unregister(object listener)
    {
        listeners.RemoveAll(l => l.Listener == listener);
    }

    public void PostEvent(object e)
    {
        listeners.Where(l => l.EventType == e.GetType()).ToList().ForEach(l => l.PostEvent(e));
    }

    private static EventBus instance;

    private EventBus() { }

    private List<EventListenerWrapper> listeners = new List<EventListenerWrapper>();

    private class EventListenerWrapper
    {
        public object Listener { get; private set; }
        public Type EventType { get; private set; }

        private MethodBase method;

        public EventListenerWrapper(object listener)
        {
            Listener = listener;

            Type type = listener.GetType();

            method = type.GetMethod("OnEvent");
            if (method == null)
                throw new ArgumentException("Class " + type.Name + " does not containt method OnEvent");

            ParameterInfo[] parameters = method.GetParameters();
            if (parameters.Length != 1)
                throw new ArgumentException("Method OnEvent of class " + type.Name + " have invalid number of parameters (should be one)");

            EventType = parameters[0].ParameterType;
        }

        public void PostEvent(object e)
        {
            method.Invoke(Listener, new[] { e });
        }
    }      
}

Exemple d'utilisation:

public class OnProgressChangedEvent
{

    public int Progress { get; private set; }

    public OnProgressChangedEvent(int progress)
    {
        Progress = progress;
    }
}

public class SomeForm : Form
{
    // ...

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        EventBus.Instance.Register(this);
    }

    public void OnEvent(OnProgressChangedEvent e)
    {
        progressBar.Value = e.Progress;
    }

    protected override void OnClosed(EventArgs e)
    {
        base.OnClosed(e);
        EventBus.Instance.Unregister(this);
    }
}

public class SomeWorkerSomewhere
{
    void OnDoWork()
    {
        // ...

        EventBus.Instance.PostEvent(new OnProgressChangedEvent(progress));

        // ...
    }
}

Vous pouvez vérifier également les extensions de Unity: http://msdn.microsoft.com/en-us/library/cc440958. aspx

[Publishes("TimerTick")]
public event EventHandler Expired;
private void OnTick(Object sender, EventArgs e)
{
  timer.Stop();
  OnExpired(this);
}

[SubscribesTo("TimerTick")]
public void OnTimerExpired(Object sender, EventArgs e)
{
  EventHandler handlers = ChangeLight;
  if(handlers != null)
  {
    handlers(this, EventArgs.Empty);
  }
  currentLight = ( currentLight + 1 ) % 3;
  timer.Duration = lightTimes[currentLight];
  timer.Start();
}

Y at-il de meilleurs?

Le Application Block Composite comprend un courtier d'événement qui pourrait être d'utiliser pour vous.

On peut trouver une autre bonne mise en œuvre à:

http://code.google .com / p / fracture / source / browse / trunk / Squared / util / EventBus.cs

Les cas d'utilisation est accessible à: /trunk/Squared/Util/UtilTests/Tests/EventTests.cs

Cette mise en œuvre n'a pas besoin de bibliothèque externe.

Une amélioration peut être être en mesure de souscrire à un type et non une chaîne.

Vous devriez vérifier l'épisode 3 Hibernation Rhinos , l'écran de Ayende lance série - « Mise en œuvre le courtier de l'événement ».

Il montre comment vous pouvez mettre en œuvre un courtier d'événements très simple à l'aide Windsor à câbler les choses. Le code source est inclus ainsi.

La solution de courtier événement proposé est très simple, mais il ne faudrait pas trop d'heures pour augmenter la solution pour permettre des arguments à passer avec les événements.

J'ai créé ceci:

https://github.com/RemiBou/RemiDDD/tree/ maître / RemiDDD.Framework / CQRS

Il y a un ninject avec dépendance. Vous avez un MessageProcessor. Si vous voulez obsere un événement, mettre en œuvre « IObserver » si vous voulez gérer une commande de mettre en œuvre « ICommandHandleer »

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top