一个简单的事件总线,用于.NET [关闭]
题
我想打一个很简单的事件总线,这将允许任何客户端订阅特定类型的事件,并在任何出版商使用EventBus.PushEvent()
方法只订阅了该特定事件类型的客户将获得推动总线上的事件该事件。
我使用C#和.NET 2.0。
解决方案 4
我发现的 通用消息总线 的。它是一个简单的类。
其他提示
微型Messenger是一个不错的选择,我在两年半的现场项目一直在使用它了。从维基(下面的链接)的某些代码示例:
<强>出版强>
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的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));
// ...
}
}
您还可以检查出统一的扩展: 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
此实现不需要外部库。
的改进可以是能够与一个类型,而不是一个串进行订阅。
您应该冬眠犀牛,Ayende的屏幕投射一系列检查出第3集事件代理程序”。
这显示了如何使用温莎接线东西实现一个非常简单的事件代理。源代码被包括在内。
提出的事件代理解决方案很简单,但它不会花费太多时间来增强解决方案,以允许与事件一起传递的参数。
我创建这样的:
https://github.com/RemiBou/RemiDDD/tree/主/ RemiDDD.Framework / CQRS
有与ninject一个扶养。 你有一个MessageProcessor的。如果你想obsere事件,实施“IObserver”如果你想处理一个命令实施“ICommandHandleer”