Frage

Ich möchte eine sehr einfache Eventbus machen, die jeder Kunde auf eine bestimmte Art von Ereignis abonnieren können und wenn jeder Verlag drückt auf den Bus ein Ereignis EventBus.PushEvent() Methode nur die Clients, die zu diesem bestimmten Ereignistyp abonniert erhalten das Ereignis.

Ich bin mit C # und .NET 2.0.

War es hilfreich?

Lösung 4

Ich fand Allgemein Message Bus . Es ist eine einfache Klasse.

Andere Tipps

Tiny Messenger ist eine gute Wahl, ich habe es jetzt in einem Live-Projekt für 2,5 Jahre. Einige Codebeispiele aus dem Wiki (Link unten):

Verlag

messageHub.Publish(new MyMessage());

Anmeldung

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

Der Code ist auf GitHub: https://github.com/grumpydev/TinyMessenger

Das Wiki ist hier: https://github.com/grumpydev/TinyMessenger/wiki

Es hat ein Nuget Paket auch

Install-Package TinyMessenger

Ein weiterer, inspiriert von EventBus für Android, aber viel einfacher:

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

Anwendungsfall:

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

        // ...
    }
}

Sie können auch Unity-Erweiterungen finden Sie unter: 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();
}

Gibt es bessere?

Die Composite Application Block- einen Ereignisvermittler enthält, die sein könnte von Ihnen verwendet werden.

Eine weitere gute Implementierung finden Sie unter:

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

Anwendungsfälle ist abrufbar unter: /trunk/Squared/Util/UtilTests/Tests/EventTests.cs

Diese Implementierung benötigt keine externe Bibliothek.

Eine Verbesserung kann in der Lage sein, mit einer Art abonnieren und kein String.

Sie sollten überprüfen Episode 3 in Hibernating Rhinos , Ayende Bildschirm Serie wirft - „Die Implementierung von der Event-Makler“.

Es zeigt, wie Sie einen sehr einfachen Event-Makler mit Windsor implementieren können die Dinge verkabeln. Der Quellcode ist ebenfalls enthalten.

Die vorgeschlagene Event-Broker-Lösung ist sehr einfach, aber es wäre die Lösung nicht zu viele Stunden erhöhen Argumente zusammen mit den Ereignissen übergeben werden können.

Ich habe diese:

https://github.com/RemiBou/RemiDDD/tree/ Master / RemiDDD.Framework / Cqrs

Es gibt eine Abhängung mit ninject. Du hast eine Message. Wenn Sie möchten, um ein Ereignis obsere, implementieren „IObserver“, wenn Sie einen Befehl zu handhaben wollen implementieren „ICommandHandleer“

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top