Orchard EventBus 事件总线及 IEventHandler作用

事件总线接口定义:
public interface IEventBus : IDependency {
        IEnumerable Notify(string messageName, IDictionary<string, object> eventData);
    }

messageName 参数说明 :

_eventBus.Notify(interfaceName + "." + methodName, data/*接口方法参数*/);

事件总线作用:

当调用Notify时,会将应用程序内所有interfaceName实类的方法轮流调用一遍,相当于广播通知. 大部分情况下 Notify并不会直接被调用, 而是通过Orchard内建的AOP机制调用.

直接使用Notify的两个例子:

AOP调用原理 :

因为 interfaceName 均继承了 IEventHandler 空接口, 而在Autofac IoC 解析父接口为IEventHandler 时,将通过 Castle dynamic proxy 创建了一个 CreateInterfaceProxyWithoutTarget 代理, 并添加了一个拦截器, 该拦截器将调用转化为通过事件总线调用

public void Intercept(IInvocation invocation) {
            var interfaceName = invocation.Method.DeclaringType.Name;
            var methodName = invocation.Method.Name;

            var data = invocation.Method.GetParameters()
                .Select((parameter, index) => new { parameter.Name, Value = invocation.Arguments[index] })
                .ToDictionary(kv => kv.Name, kv => kv.Value);

            //拦截方法调用,将其转化为事件总线调用,广播调用消息.
            var results = _eventBus.Notify(interfaceName + "." + methodName, data);

            invocation.ReturnValue = Adjust(results, invocation.Method.ReturnType);
        }
 
实现步骤: 
1.自定义Autofac Module
2.在Autofac Module中自定义解析过程,将所有父接口为 IEventHandler 的服务采用Castle动态代理拦截.
3.拦截器将调用转化为事件总线方式,广播给应用程序中所有该接口的实例,轮流调用.
时间: 2024-10-13 09:55:02

Orchard EventBus 事件总线及 IEventHandler作用的相关文章

Guava - EventBus(事件总线)

Guava在guava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计. 不再多的废话,直奔Guava EventBus主题.首先Guava为我们提供了同步事件EventBus和异步实现AsyncEventBus两个事件总线,他们都不是单例的,官方理由是并不想我们我们的使用方式.当然如果我们想其为单例,我们可以很容易封装它,一个单例模式保证只创建一个实例就对了. 下面

Android EventBus事件总线剖析

概述 EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息. 它是一个基于观察者模式的事件发布/订阅框架,开发者可以通过极少的代码去实现多个模块之间的通信,而不需要以层层传递接口的形式去单独构建通信桥梁.从而降低因多重回调导致的模块间强耦合,同时避免产生大量内部类.它拥有使用方便,性能高,接入成本低和支持多线程的优点,实乃模块解耦.代码重构必备良药.

EventBus 事件总线 简介 案例

简介 地址:https://github.com/greenrobot/EventBus EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息. 优点是开销小,代码更优雅,以及将发送者和接收者解耦. 包含4个成分:发布者,订阅者,事件,总线. 这四者的关系:订阅者订阅事件到总线,发送者发布事件:订阅者可以订阅多个事件,发送者可以发布任何事件,发布者同时

EventBus事件总线分发库

本文围绕以下六个部分展开: 一.事件总线管理 二.EventBus 三.EventBus与BroadcastReceiver的区别 案例一 案例二:一处点击发送数据,另一处或多处注册点可以及时获取更新传输过来的数据 案例三:Activity和Service之间互相发布与接收事件 一.事件总线管理 将事件放入队列里,用于管理和分发. (1)保证应用的各个部分之间高效的通信及数据.事件分发. (2)模块间解耦:通过事件的分发,可以让各个模块间关联程序变小. 当在开发一些庞大的的项目时,模块比较多,这

EventBus 事件总线 原理

原理 一句话描述:register会把当前类中匹配的方法,存入一个map,而post会根据实参去map查找进行反射调用 撇开专业术语,其实EventBus就是在内部[存储]了一堆onEvent开头的方法,然后post的时候,根据post传入的[参数],去找到匹配的方法,[反射]调用之. 另外,它内部使用了[Map]进行存储,[键就是参数的Class类型].知道是这个类型,那么你觉得根据post传入的参数进行查找还是个事么? 其实不用发布者,订阅者,事件,总线这几个词或许更好理解,以后大家问了Ev

EventBus 事件总线模式实例(发布/订阅事件)

在我们公司经常用到总线,具体的总线是什么让我理解我也不清楚,但是在这几个月下来,我已经知道总线如何使用,现在加上示例讲解总线如何使用. 1. 首先我们的新建一个类,这个类其实是用于总线传递的模型 using System; namespace PurchaseDevices.Model.CommonModel{/// <summary>/// 事件传递参数/// </summary>/// <typeparam name="T"></typep

EventBus事件总线框架(发布者/订阅者模式,观察者模式)

一. android应用内消息传递的方式: 1. handler方式-----------------不同线程间传递消息. 2. Interface接口回调方式-------任意两个对象. 3. Intent进行组件间通信,广播方式. 二.单例比较好的写法: private static volatile EventBus defaultInstance; 构造函数应当是private,不应该是public 1 public static EventBus getDefault() { 2 if

android事件总线(eventbus)设计与实现

1. 功能介绍 AndroidEventBus是一个Android平台的事件总线库, 它简化了Activity.Fragment.Service等组件或者对象之间的交互,很大程度上降低了它们之间的耦合,使得我们的代码更加简洁,耦合性更低,提升我们的代码质量. AndroidEventBus吸收了greenrobot的EventBus以及square的otto的优点,并在此基础上做出了相应的改进,使得事件总线框架更适合用户的使用习惯,也使得事件的投递更加的精准.灵活. 与EventBus.otto

AndroidEventBus ( 事件总线 ) 的设计与实现

1. 功能介绍 AndroidEventBus是一个Android平台的事件总线库, 它简化了Activity.Fragment.Service等组件或者对象之间的交互,很大程度上降低了它们之间的耦合,使得我们的代码更加简洁,耦合性更低,提升我们的代码质量. AndroidEventBus吸收了greenrobot的EventBus以及square的otto的优点,并在此基础上做出了相应的改进,使得事件总线框架更适合用户的使用习惯,也使得事件的投递更加的精准.灵活. 与EventBus.otto