事件總線接口定義:
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.攔截器將調用轉化爲事件總線方式,廣播給應用程序中全部該接口的實例,輪流調用.