事件总线接口定义:
public interface IEventBus : IDependency { IEnumerable Notify(string messageName, IDictionary<string, object> eventData); }
messageName 参数说明 :html
_eventBus.Notify(interfaceName + "." + methodName, data/*接口方法参数*/);
事件总线做用:代理
当调用Notify时,会将应用程序内全部interfaceName实类的方法轮流调用一遍,至关于广播通知. 大部分状况下 Notify并不会直接被调用, 而是经过Orchard内建的AOP机制调用.htm
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.拦截器将调用转化为事件总线方式,广播给应用程序中全部该接口的实例,轮流调用.