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的两个例子:A}YJXJ8N0X3R0YR97D]6{AF_thumb[3]

 

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.拦截器将调用转化为事件总线方式,广播给应用程序中所有该接口的实例,轮流调用.
posted @ 2015-11-15 17:04  白菜89  阅读(998)  评论(0编辑  收藏  举报