我的需求
我希望我们的内部标准产品可以在事情发生时触发不同的事件.
在不同自定义解决方案的全局asax中,我想在需要时联系这些事件并做出反应.
现有模块
我一直在寻找asp.net的事件聚合器,但我不确定要使用什么.
我读过关于Prism的内容,但似乎这个目标是WPF / Silverlight,而不是asp.net.
然后就是这个人,似乎已将聚合器移植到他自己的版本中,独立于WPF:http://weblogs.asp.net/rashid/archive/2009/03/05/use-event-aggregator-to-make-your-application-more-extensible.aspx
题
有没有人使用asp.net的事件聚合器?这是用于生产用途,所以我不想使用网上随机人员的一些家庭编码的聚合器:)
先感谢您.
编辑1:
看起来,NServiceBus有点矫枉过正.我创建了一个EventAggregator类来完成这个技巧.
班级:
/// <summary> /// A event aggregator. /// </summary> public class EventAggregator { /// <summary>The object to use when locking.</summary> private readonly object _lock = new object(); /// <summary>Holder of registered event handlers</summary> private readonly Dictionary<Type,List<object>> _handlers = new Dictionary<Type,List<object>>(); /// <summary>Registers the specified handler.</summary> /// <typeparam name="T"></typeparam> /// <param name="handler">The handler.</param> public void Register<T>(EventHandler<T> handler) where T : EventArgs { lock (_lock) { if (!_handlers.ContainsKey(typeof (T))) _handlers.Add(typeof (T),new List<object>()); _handlers[typeof (T)].Add(handler); } } /// <summary>Publishes the specified event.</summary> /// <typeparam name="T"></typeparam> /// <param name="sender">The sender.</param> /// <param name="eventToPublish">The event to publish.</param> public void Publish<T>(object sender,T eventToPublish) where T : EventArgs { lock (_lock) { if (!_handlers.ContainsKey(typeof (T))) return; // No listers for event foreach (EventHandler<T> handler in _handlers[typeof (T)]) handler.Invoke(sender,eventToPublish); } } }
一个事件类:
public class EntityDeleted : EventArgs { }
在全局asax中注册事件处理程序:
aggregator.Register<EntityDeleted>((s,e) => { // Do stuff here });
举办活动:
aggregator.Publish(this,new EntityDeleted());
编辑2:
这是我对受害者的单元测试:
/// <summary> /// Unit tests for EventAggregator /// </summary> [TestClass] public class EventAggregatorTest { /// <summary>Tests that no exceptions are thrown when calling an event with no handlers.</summary> [TestMethod] public void EmptyAggregatortest() { var aggregator = new EventAggregator(); aggregator.Publish(this,new TestEventOne() { Property = "p1" }); } /// <summary>Tests the aggregator using a single,registered handler.</summary> [TestMethod] public void SingleListenertest() { var aggregator = new EventAggregator(); int calls = 0; aggregator.Register<TestEventOne>((sender,e) => { Assert.AreEqual("p1",e.Property); calls ++; }); Assert.AreEqual(0,calls); aggregator.Publish(this,new TestEventOne(){Property = "p1"}); Assert.AreEqual(1,calls); } /// <summary>Tests the aggregator using multiple registered handlers.</summary> [TestMethod] public void MultipleListenerstest() { var aggregator = new EventAggregator(); int p1Calls = 0; int p2Calls = 0; aggregator.Register<TestEventOne>((sender,e.Property); p1Calls++; }); aggregator.Register<TestEventOne>((sender,e.Property); p1Calls++; }); aggregator.Register<TestEventTwo>((sender,e) => { Assert.AreEqual("p2",e.Property); p2Calls++; }); Assert.AreEqual(0,p1Calls); aggregator.Publish(this,new TestEventOne() { Property = "p1" }); Assert.AreEqual(2,p1Calls); Assert.AreEqual(0,p2Calls); aggregator.Publish(this,new TestEventTwo() { Property = "p2" }); Assert.AreEqual(1,p2Calls); Assert.AreEqual(2,p1Calls); } } /// <summary> /// Dummy test event 1 /// </summary> public class TestEventOne : EventArgs { public string Property { get; set; } } /// <summary> /// Dummy test event 2 /// </summary> public class TestEventTwo : EventArgs { public string Property { get; set; } }
编辑3:
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。