码迷,mamicode.com
首页 > 其他好文 > 详细

Orchard EventBus 事件总线及 IEventHandler作用

时间:2015-11-15 17:50:41      阅读:450      评论:0      收藏:0      [点我收藏+]

标签:

事件总线接口定义:
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.拦截器将调用转化为事件总线方式,广播给应用程序中所有该接口的实例,轮流调用.

Orchard EventBus 事件总线及 IEventHandler作用

标签:

原文地址:http://www.cnblogs.com/cabbage/p/4966753.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!