Sample publisher

Publish an event topic:

1
2
3
4
5
6
7
8
9
10
public class Publisher
{
    [EventPublication("topic://EventBrokerSample/SimpleEvent")]
    public event EventHandler SimpleEvent;
     
    public void FireSimpleEvent()
    {
        SimpleEvent(this, EventArgs.Empty);
    }
}

Register the publisher with your event broker (you have to hold an instance of the event broker somewhere in your code).

1
2
3
EventBroker eventBroker = ...;
Publisher publisher = new Publisher();
eventBroker.Register(publisher);

On registration of the publisher, the event broker inspects the publisher for published events (events with the EventPublication attribute).

Sample subscriber

Subscribe to an event topic:

1
2
3
4
5
6
7
8
9
10
11
public class Subscriber
{
    [EventSubscription(
        typeof(OnPublisher))]
 
    public void SimpleEvent(object sender, EventArgs e)
    {
        // do something useful or at least funny
    }
}

Register the subscriber with the event broker:

1
2
3
EventBroker eventBroker = ...;
Subscriber subscriber = new Subscriber();
eventBRoker.Register(subscriber);

The event broker will inspect the subscriber on registration for subscription to event topics (methods with the EventSubscription attribute).

If a publisher fires an event topic for that subscribers are registered, then the event broker will relay them to the subscribers by calling the subscription handler methods with the sender and EventArgs the publisher used to fire its event.

Publication options

Simple

1
2
[EventPublication("topic://Simple")]
public event EventHandler SimpleEvent;

With custom Eventargs

Note: CustomEventArgs has simply to be derived from EventArgs.

1
2
[EventPublication("topic://CustomEventArgs")]
public event EventHandler<CustomEventArguments> CustomEventArgs;

Publish multiple event topics with one single event

1
2
3
4
[EventPublication("Event1")]
[EventPublication("Event2")]
[EventPublication("Event3")]
public event EventHandler MultiplePublicationTopics;

Allow only synchronous subscription handlers

1
2
[EventPublication("topic://Simple", HandlerRestriction.Synchronous)]
public event EventHandler AnEvent;

Allow only asynchronous subscription handlers

1
2
[EventPublication("topic://Simple", HandlerRestriction.Asynchronous)]
public event EventHandler AnEvent;

Subscription options

Simple

1
2
[EventSubscription("topic://Simple", typeof(OnPublisher)]
public void SimpleEvent(object sender, EventArgs e) {}

Custom EventArgs

1
2
[EventSubscription("topic://CustomEventArgs"), typeof(OnPublisher))]
public void CustomEventArgs(object sender, CustomEventArgs e) {}

Subscribe multiple event topics

1
2
3
4
[EventSubscription("Event1", typeof(OnPublisher))]
[EventSubscription("Event2", typeof(OnPublisher))]
[EventSubscription("Event3", typeof(OnPublisher))]
public void MultipleSubscriptionTopics(object sender, EventArgs e) {}

Execute handler on background thread (asynchronous)

The event broker creates a worker thread to execute the handler method on. The publisher can immediately continue processing.

1
2
[EventSubscription("topic://Background", typeof(OnBackground))]
public void BackgroundThread(object sender, EventArgs e) {}

Execute handler on UI thread

Use this option if calling from a background worker thread to a user interface component that updates the user interface - no need for Control.Invoke(...) anymore.

1
2
[EventSubscription("topic://UI", typeof(OnUserInterface))]
public void UI(object sender, EventArgs e) {}

Note that if you use the OnUserInterface handler, you have to make sure that you register the subscriber on the user interface thread. Otherwise, the EventBroker won't be able to switch to the user interface thread, and will throw an exception.

Execute handler on UI thread asynchronously

The same as above, but the publisher is not blocked until the subscriber has processed the event.

1
2
[EventSubscription("topic://UIAsync", typeof(OnUserInterfaceAsync))]
public void UI(object sender, EventArgs e) {} 

Simplified subscription handler signatures

If you are not interested in the sender of the event, you can leave the sender out in the handler method:

1
2
[EventSubscription("topic://handle.me", typeof(OnPublisher))]
public void Handle(EventArgs e) {} 

If you also don't need the event arguments, you can ignore them, too:

1
2
[EventSubscription("topic://handle.me", typeof(OnPublisher))]
public void Handle() {} 

And if you have a generic event argument EventArgs<T>, you can directly define the content value of the event arguments:

1
2
3
4
5
[EventPublication("topic://handle.me")]
public event EventHandler<EventArgs<string>> Event;
 
[EventSubscription("topic://handle.me", typeof(OnPublisher))]
public void Handle(string value) {} 

These are the basics about the EventBroker. See the rest of the documentation for more options and details.

EventBroker的更多相关文章

  1. C#编程实践—EventBroker简单实现

    前言 话说EventBroker这玩意已经不是什么新鲜货了,记得第一次接触这玩意是在进第二家公司的时候,公司产品基础架构层中集成了分布式消息中间件,在.net基础服务层中使用EventBroker的模 ...

  2. EventBus总线讲解

    在我们公司经常用到总线,具体的总线是什么让我理解我也不清楚,但是在这几个月下来,我已经知道总线如何使用,现在加上示例讲解总线如何使用. 1. 首先我们的新建一个类,这个类其实是用于总线传递的模型 us ...

  3. Nop源码分析一

    从Global.asax文件开始逐层分析Nop的架构. Application_Start()方法作为mvc启动的第一个方法. 1,首先初始化一个引擎上下文,如下面的代码: EngineContext ...

  4. NopCommerce使用Autofac实现依赖注入

    NopCommerce的依赖注入是用的AutoFac组件,这个组件在nuget可以获取,而IOC反转控制常见的实现手段之一就是DI依赖注入,而依赖注入的方式通常有:接口注入.Setter注入和构造函数 ...

  5. Enhanced RCP: How views can communicate – The e4 way | Tomsondev Blog

    Some weeks ago I published how views can communicate using the EventAdmin-Service. To get things wor ...

  6. NopCommerce架构分析之一----依赖类生成容器

    NopCommerce为了实现松耦合的框架设计目的,使用了IOC框架:Autofac.据有人测试,Autofac是性能好的IOC工具. 1.在IOC中,组件首先需要在IOC中注册,有通过配置文件注册的 ...

  7. How to detect and avoid memory and resources leaks in .NET applications

    By Fabrice Marguerie Despite what a lot of people believe, it's easy to introduce memory and resourc ...

  8. NopCommerce架构分析(转载)

    原文 一,NopCommerce架构分析之开篇 NopCommerce是.net开源项目中比较成熟的一款业务应用框架,也是电子商务系统中的典范.所以很想多学习一下里面的设计和实现方式. 二,NopCo ...

  9. Eclipse Package Explorer视图无法打开

    打开Eclipse后Package Explorer视图无法打开,显示一个红叉,红叉后面的Deatils后,显示下面的内容: java.lang.ArrayIndexOutOfBoundsExcept ...

随机推荐

  1. PHP-网页跳转的几种方式

    本文总结了跳转到指定网页的几种方式. 1.利用PHP的header函数Location响应头, header是用来向浏览器返回HTTP响应头(详细请看HTTP协议详解) <?php header ...

  2. java_queue

    队列是一种特殊的线性表,先进先出(first in first out)FIFO,它只允许在表的前端(front)进行删除操作,只允许在表的后端(rear)进行插入操作. 实际应用:排队等待公交车,银 ...

  3. Sklearn库例子2:分类——线性回归分类(Line Regression )例子

    线性回归:通过拟合线性模型的回归系数W =(w_1,…,w_p)来减少数据中观察到的结果和实际结果之间的残差平方和,并通过线性逼近进行预测. 从数学上讲,它解决了下面这个形式的问题:      Lin ...

  4. docker 使用redis

    1. 安装 centos 7 yum install  docker 2. 启动 修改配置: nano  /etc/sysconfig/docker 添加一下信息: OPTIONS='--selinu ...

  5. 服务器能访问共享,但是ping不通解决方案

    今天发现客户反映后台连不上数据库,远程程查看之后发现机器可以访问服务器共享,但是ping网络的时候ping不通.Ip设置也没问题,网络也都连上了,而且客户反映他们那其它机器都能连上. 百度了一下,发现 ...

  6. Dom之标签增删操作

    dom操作:THML新增子标签 a标签(appendChild) <!DOCTYPE html><html lang="en"><head> & ...

  7. C#.Net中的转义字符

    当声明一个字符串变量时有一些字符是不能以平常的方式包含在变量中的.为了解决这个问题,C#提供了两种不同的方法. 第一种方法是使用’转义序列’.例如,我们想得到如下的字符串 “Hello World H ...

  8. Dynamics CRM4.0 和 Dynamics CRM2011 Plugin 实现一样的功能的方法的比较

    1.给类型赋值不同 CRM4 plugin给lookup赋值为空 : Lookup lookupnull = new Lookup(); lookupnull.IsNull = true; looku ...

  9. 使用async属性异步加载执行JavaScript

    HTML5让我兴奋的一个最大的原因是,它里面实现的新功能和新特征都是我们长久以来一直期待的.比如,我以前一直在使用placeholders,但以前必须要用JavaScript实现.而HTML5里给Ja ...

  10. WCF学习心得------(二)设计和实现服务协定

    设计和实现服务协定 创建服务协定—WCF术语 消息 消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头. 服务 服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个 ...