Orchard EventBus 事件總線及 IEventHandler做用

事件總線接口定義:
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

直接使用Notify的兩個例子:A}YJXJ8N0X3R0YR97D]6{AF_thumb[3]blog

 

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.攔截器將調用轉化爲事件總線方式,廣播給應用程序中全部該接口的實例,輪流調用.
相關文章
相關標籤/搜索