Простая шина событий для .NET [закрыто]

Я хочу создать очень простую шину событий, которая позволит любому клиенту подписаться на определенный тип события, и когда любой издатель отправляет событие на шину, используя EventBus.PushEvent()метод, только клиенты, которые подписались на этот конкретный тип события, получат событие.

Я использую C # и .NET 2.0.

15.12.2008 12:49:17
Очередь сообщений на основе redis github.com/antirez/disque
ZOXEXIVO 1.10.2015 21:22:55
8 ОТВЕТОВ

Вы должны проверить эпизод 3 в Hibernating Rhinos , сериале скриншотов Айенде - «Реализация брокера событий».

Он показывает, как вы можете реализовать очень простой брокер событий, использующий Windsor для связи. Исходный код также включен.

Предложенное решение для брокера событий очень просто, но не требуется слишком много времени, чтобы дополнить решение, чтобы позволить передавать аргументы вместе с событиями.

0
15.12.2008 13:20:39

В составной блок приложений входит брокер событий, который может быть вам полезен.

1
15.12.2008 13:25:48
РЕШЕНИЕ

Я нашел Generic Message Bus . Это один простой класс.

2
7.03.2012 21:11:59

Вы также можете проверить расширения 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();
}

Есть лучшие?

2
5.11.2009 14:56:27

Другая хорошая реализация может быть найдена в:

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

Варианты использования доступны по адресу: /trunk/Squared/Util/UtilTests/Tests/EventTests.cs

Эта реализация не нуждается во внешней библиотеке.

Улучшение может заключаться в возможности подписываться с типом, а не строкой.

1
22.04.2010 14:51:20

Tiny Messenger - хороший выбор, я использую его в живом проекте уже 2,5 года. Некоторые примеры кода из вики (ссылка ниже):

Издательский

messageHub.Publish(new MyMessage());

Подписавшись

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

Код на GitHub: https://github.com/grumpydev/TinyMessenger

Вики здесь: https://github.com/grumpydev/TinyMessenger/wiki

Он также имеет пакет Nuget

Install-Package TinyMessenger
21
16.08.2019 12:59:03
+1 для TinyMessenger, крошечной шины сообщений, которая могла.
Mhmmd 2.08.2013 16:52:25

Я создал это:

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

Есть зависимость от ниндзя. Вы получили MessageProcessor. Если вы хотите наблюдать событие, реализуйте «IObserver», если вы хотите обработать команду, реализующую «ICommandHandleer»

0
25.02.2013 12:30:14

Еще один, вдохновленный EventBus для Android, но гораздо проще:

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

Случай использования:

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

        // ...
    }
}
6
6.05.2014 08:00:17