Pregunta

Quiero hacer un bus de eventos muy simple que permitirá que cualquier cliente para suscribirse a un determinado tipo de evento y cuando cualquier editorial empuja un evento en el bus usando EventBus.PushEvent() sólo los clientes que se ha suscrito a ese tipo de evento particular, el método recibirá el evento.

Estoy usando C # y .NET 2.0.

¿Fue útil?

Solución 4

He encontrado Genérico Bus de mensajes . Es una clase simple.

Otros consejos

Tiny Messenger es una buena opción, he estado usando en un proyecto vivo durante 2,5 años. Algunos ejemplos de código desde el wiki (enlace más abajo):

Publishing

messageHub.Publish(new MyMessage());

Noticias E

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

El código está en GitHub: https://github.com/grumpydev/TinyMessenger

El Wiki está aquí: https://github.com/grumpydev/TinyMessenger/wiki

Tiene un paquete Nuget también

Install-Package TinyMessenger

Otra, inspirado en EventBus para android, pero mucho más 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 });
        }
    }      
}

Caso de uso:

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

        // ...
    }
}

Es posible que también echa un vistazo a las extensiones de la unidad: 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();
}

¿Hay otros mejores?

El Composite Application Block incluye un gestor de eventos que podrían ser de utilidad para usted.

Otra buena aplicación se puede encontrar en:

http://code.google .com / p / fractura / fuente / Navegar / trunk / cuadrado / util / EventBus.cs

Los casos de uso es accesible en: /trunk/Squared/Util/UtilTests/Tests/EventTests.cs

Esta aplicación no necesita biblioteca externa.

Una mejora puede ser que podrán suscribirse con un tipo y no una cadena.

Debe retirar el episodio 3 en Hibernante rinocerontes , la pantalla del Ayende arroja serie - "Ejecución el gestor de eventos".

Se muestra cómo se puede implementar un gestor de eventos muy simple usando Windsor a cablear las cosas. El código fuente se incluye también.

La solución propuesta gestor de eventos es muy simple, pero que no tomaría demasiadas horas para aumentar la solución para permitir que los argumentos que se pasan junto con las entradas.

He creado este:

https://github.com/RemiBou/RemiDDD/tree/ maestro / RemiDDD.Framework / CQRS

Hay una dependencia con ninject. ¿Tienes un MessageProcessor. Si desea obsere un evento, ejecutar "IObserver" si desea gestionar un comando de implementar "ICommandHandleer"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top