c# – asp.net的事件聚合器
我的需求
我希望我们的内部标准产品可以在事情发生时触发不同的事件. 现有模块 我一直在寻找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: 班级: /// <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: 感谢Steven Robbins指出,聚合器不是线程安全的,我在发布和注册方法中添加了锁定. 解决方法
我有一个类似的要求,为此我使用NServiceBus开源与大社区和伟大的文档来获取更多信息试试这个链接
http://docs.particular.net/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails-4 – 使用rails 4和rspec 3通过verify_parti
- Ajax中的async
- 为什么一些Ruby代码在2.53GHz上的运行速度要比在2.2GHz Cor
- React 服务器渲染原理解析与实践(同步更新)
- webstorm添加vue.js支持的方法教程
- ruby-on-rails – FactoryGirl belongs_to association
- C#对Access进行增删改查的完整示例
- Cocos2d-x TableView用法
- c# – Control.Dispatcher.BeginInvoke()和Control.Dispatc
- flex MenuBar