Unity快速入門的例子中有一個Block Event Broker通過對容器功能的擴充來實現事件截獲,其中擴充的代碼在項目EventBrokerExtension。該項目允許在應用程式種使用自訂的容器擴充來發布和訂閱事件。
自訂Unity 容器擴充是一個從 UnityContainerExtension 基類繼承而來並且實現了一些額外的方法的自訂類型。該擴充可以訪問容器,並且可以接收到容器中已經註冊的事件.
SimpleEventBrokerExtension 類繼承 UnityContainerExtension ,它從SimpleEventBroker 工程檔案中建立了一個新的EventBroker 類對象,然後重寫了UnityContainerExtension 基類的Initialize 方法
SimpleEventBrokerExtension 中Initialize 方法代碼如下,添加一個新的 EventBroker ,該 EventBroker 建立到容器的 Locator,以便其他的類能夠輕易的定位並引用他,然後他向 Unity 管道添加了2個策略.他向 PreCreation 添加一個反射策略,這樣他就能夠檢查到2個特性,該特性將由擴充使用(他們是 PublishesAttribute 和SubscribesToAttribute),此外他還添加了一個繫結原則到 Initialization,該策略用來註冊一些訂閱者和發行者,但是訂閱者和發行者必須是由 EventBroker 代理類註冊的.
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.ObjectBuilder;
using SimpleEventBroker;
namespace EventBrokerExtension
{
public class SimpleEventBrokerExtension : UnityContainerExtension, ISimpleEventBrokerConfiguration
{
private EventBroker broker = new EventBroker();
protected override void Initialize()
{
Context.Locator.Add(typeof(EventBroker), broker);
Context.Strategies.AddNew<EventBrokerReflectionStrategy>(UnityBuildStage.PreCreation);
Context.Strategies.AddNew<EventBrokerWireupStrategy>(UnityBuildStage.Initialization);
}
public EventBroker Broker
{
get { return broker; }
}
}
}
EventBroker 類提供了Dictionary ,用來包含全部的事件名到發行者的映射,並且暴露了一些註冊發行者和訂閱者的方法,(方法是RegisterPublisher 和RegisterSubscriber)。他也暴露了一些用於特定的事件的反註冊方法.這些方法的發部分功能全部在PublishedEvent 類裡,該類儲存,暴露了所有的發行者和訂閱者隊列
在前一個隊列裡的Initialize 的方法裡,通過調用EventBroker 類的RegisterPublisher方法 和RegisterSubscriber 方法,wire-up 策略通過Initialize 被添加到Unity .這就是說當Unity 發現PublishesAttribute 和SubscribesToAttribute 特性的時候,他會在EventBroker自動註冊類或者類的成員使他成為個發行者或者訂閱者。
如果註冊成為一個發行者,EventBroker 則調用PublishedEvent 類的AddPublisher 方法,該方法將添加一個新的的發行者到發行者隊列之中,並且為發布的事件串連到一個名叫OnPublisherFiring 的事件處理方法.所以當發行者發布事件的時候,PublishedEvent 類中的事件處理方法將通過訂閱者隊列的事件訂閱代理調用每一個方法來做出事件對應的反應.代碼如下.
在您建立了一個自訂容器擴充以後,你需要把他添加到Unity 容器.您可以通過編譯並且指定一個類型和程式集的名稱,然後寫入設定檔,也可以通過編程的方式添加到Unity, 事件截獲擴充的快速入門通過調用Unity 容器類的一個方法,將自訂的SimpleEventBrokerExtension 類型在啟動並執行時候添加到容器中.
private static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
UnityContainer rootContainer = new UnityContainer();
rootContainer.AddNewExtension<SimpleEventBrokerExtension>();
Application.Run(rootContainer.Resolve<DefaultForm>());
}