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>());
}
本文来自云栖社区合作伙伴“doNET跨平台”,了解相关信息可以关注“opendotnet”微信公众号