自定义Unity 容器的扩展 --- Unity Application Block Event Broker

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>());   
 }  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT技术精选文摘

Nginx模块之Filter解析

过滤模块简介 执行时间和内容 过滤(filter)模块是过滤响应头和内容的模块,可以对回复的头和内容进行处理。它的处理时间在获取回复内容之后,向用户发送响...

29590
来自专栏用户画像

Windows系统 配置Java开发环境 JDK与JRE

       通过oracle官网---->下载---->Java---->Java SE找JDK8

13840
来自专栏社区的朋友们

深入浅出 Nodejs( 二 ):Nodejs 文件模块机制

本篇教程关于Nodejs的文件模块机制,具体讲CommonJs规范以及Nodejs文件模块的实现原理。

58420
来自专栏difcareer的技术笔记

如何快速定位native方法在对应so中的位置前言原理

在逆向的时候,有些应用有一大堆的so,而且都是提前加载好,有的so甚至做了处理,很难看出函数名。本文讲述的方法可以快速定位:

14120
来自专栏喵了个咪的博客空间

phalcon-入门篇2(HelloWord与PhalconTools)

#phalcon-入门篇2(HelloWord与PhalconTools)# ? 本教程基于phalcon2.0.9版本 ##前言## 先在这里感谢各位phal...

38680
来自专栏Golang语言社区

Golang语言社区--【游戏服务器知识】多线程并发

引言:上篇文章说到了多进程并发式的服务端模型,如上一篇文章所述,进程的频繁创建会导致服务器不堪负载,那这一篇博客主要讲述的是线程模型和线程池的方式来提高服务端的...

36040
来自专栏Golang语言社区

golang的垃圾回收(GC)机制

golang的垃圾回收采用的是 标记-清理(Mark-and-Sweep) 算法 就是先标记出需要回收的内存对象快,然后在清理掉; 在这里不介绍标记和清理的具体...

46970
来自专栏黄Java的地盘

如何实现一个HTTP请求库——axios源码阅读与分析

在前端开发过程中,我们经常会遇到需要发送异步请求的情况。而使用一个功能齐全,接口完善的HTTP请求库,能够在很大程度上减少我们的开发成本,提高我们的开发效率。

18120
来自专栏coder修行路

Python 并发编程(一)之线程

常用用法 t.is_alive() Python中线程会在一个单独的系统级别线程中执行(比如一个POSIX线程或者一个Windows线程) 这些线程将由操作系统...

30260
来自专栏DOTNET

【翻译】MongoDB指南/CRUD操作(三)

【原文地址】https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Tran...

30990

扫码关注云+社区

领取腾讯云代金券