質問

私は、任意のクライアントが特定の型のイベントにサブスクライブすることができますし、任意の出版社がバス使用EventBus.PushEvent()法上のイベントを押すと、その特定のイベントタイプに加入したクライアントだけが得る非常に単純なイベントバスを作りたいですイベントます。

私はC#と.NET 2.0を使用しています。

役に立ちましたか?

解決 4

私が見つけた ジェネリックメッセージバスの。これは、1つの単純なクラスです。

他のヒント

小型メッセンジャーは良い選択ですが、私は今、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

別のアンドロイドのためEventBusに触発1、が、はるかに簡単ます:

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

        // ...
    }
}

また、ユニティ拡張をチェックアウトすることがあります。 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();
}

が、より良いものはありますか?

かもしれないイベント・ブローカを含むの複合アプリケーションブロックあなたに使用します。

もう一つの良い実装がで見つけることができます:

http://code.google .COM / P /骨折/ソース/閲覧/トランク/スクエア/ Utilの/ EventBus.csする

例を使用してくださいでアクセスできます。 /trunk/Squared/Util/UtilTests/Tests/EventTests.cs

この実装は、外部ライブラリを必要としません。

向上タイプとしない文字列で購読することができるようにしてもよい。

「実装 - あなたは冬眠サイの中のエピソード3をチェックアウトする必要があります。

、Ayendeの画面には、シリーズのキャストイベントブローカー」ます。

それはあなたが物事を配線するウィンザーを使用して、非常に単純なイベントブローカーを実装する方法を示しています。ソースコードは、同様に含まれます。

提案イベントブローカーソリューションは非常に簡単ですが、それは引数は、イベントと一緒に渡すことができるようにするソリューションを強化するためにあまりにも多くの時間を取ることはありません。

私はこれを作成します:

https://github.com/RemiBou/RemiDDD/tree/マスター/ RemiDDD.Framework / Cqrsする

ninjectとの依存性があります。 あなたはMessageProcessorを得ました。あなたがイベントをobsereしたい場合は、「ICommandHandleer」

を実装するコマンドを処理したい場合は、「IObserver」を実装
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top