事件总线接口定义:
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