標籤:
事件匯流排介面定義:
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作用