首页 / C# / c# – asp.net的事件聚合器
c# – asp.net的事件聚合器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – asp.net的事件聚合器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4024字,纯文字阅读大概需要6分钟。
内容图文
我的需求
我希望我们的内部标准产品可以在事情发生时触发不同的事件.
在不同自定义解决方案的全局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) =>
{
Assert.AreEqual("p1", e.Property);
p1Calls++;
});
aggregator.Register<TestEventOne>((sender, e) =>
{
Assert.AreEqual("p1", 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开源与大社区和伟大的文档来获取更多信息试试这个链接
内容总结
以上是互联网集市为您收集整理的c# – asp.net的事件聚合器全部内容,希望文章能够帮你解决c# – asp.net的事件聚合器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。