当前位置 :主页 > 财经 >
ABP文档(二十)【领域事件】
ABP文档(二十)【领域事件】
* 来源 :http://www.vivosinvivirenmi.com * 作者 : * 发表时间 : 2018-06-23 19:45

  在C#中,一个类可以定义其专属的事件并且其它类可以注册该事件并,当事件被触发时可以获得事件通知。这对于对于桌面应用程序或的Windows Service来说非常有用。但是, 对于Web应用程序来说会有点问题,因为对象是根据请求(request)被创建并且它们的生命周期都很短暂。我们很难注册其它类别的事件。同样地,直接注册其它类别的事件也造成了类之间的耦合性。

  在应用系统中,领域事件可以被用于解耦业务逻辑以及对领域的重要更改做出反应。

  事件总线为一个单体(singleton)的对象,它由所有其它类所共享,可通过它触发和处理事件。要使用这个事件总线,你需要引用它。你可以用两种方式来实现:

  你可以使用依赖注入来获取对IEventBus的引用。这里使用的是属性注入的方式:

  对于事件总线,更适合的方式是属性注入而不是构造函数注入。因此,你的类可以没有事件总线也能够正常的工作。NullEventBus实现了空对象模式。当你调用它的方法,它不会做任何事情。

  如果你不能注入它,你可以直接使用EventBus.Default。它是全局事件总线并且可以以如下方式使用:

  无论在什么地方,你尽可能的别直接使用EventBus.Default,因为那样使单元测试会很困难。

  触发事件之前,首先你应该定义该事件。事件是派生自EventData的类。假设我们想要触发一个事件,当某个任务完成的时候:

  这个类包含了处理这个事件所需要包含的属性。EventData定义了EventSource(那个对象触发了该事件) 以及EventTime(什么时候触发的) 属性。

  ABP定义AbpHandledExceptionData事件,并且在异常发生的时候自动地触发这个事件。这在你想要取得更多关于异常的信息时特别有用(即便ABP已自动地纪录所有的异常)。你可以注册这个事件来发出通知当某个异常发生的时候。

  ing事件是指(例如:EntityUpdating) 该类事件被触发是在保存实体更改到数据库之前。所以你可以在这些事件里面抛出某个异常来回滚工作单元来当前的更改操作。ed事件是指(例如:EntityUpdated) 该类事件被触发是在保存实体更改到数据库之后,这样就不可能有机会回滚工作单元。

  实体更改事件被定义在Abp.Events.Bus.Entities命名空间,并且在某个实体被插入,更新或者删除的时候,ABP可以自动的触发它们。如果你有一个Person实体,可以注册EntityCreatedEventDataPerson事件来产生通知,当一个新的的Person实体被创建且插入到数据库的时候,ABP就会自动的触发该事件。这些事件也支持继承。如果Student类继承自Person类,并且你注册了EntityCreatedEventDataPerson事件,接着你将会在Person或Student实体被插入后后收到触发。

  其他触发事件的方式是我们可以使用聚合根类的领域事件集合,详细请参考文档:实体。

  当然,你也可以实现IEventHandlerEventData来处理所有的事件,如果你真的想要这样做的话(注:作者不太这种方式)。

  在单个处理器(handler)中我们可以处理多个事件。此时,你应该针对不同事件实现IEventHandlerT。范例如下:

  事件总线触发所有异常处理器,即使抛出异常是这些中的某个或者某些。如果你仅想抛出这些异常中的某一个,那么你可以直接通过该触发器方法抛出异常。如果超过一个的处理器抛出异常,那么事件总线会对这些异常抛出一个单独的AggregateException。

  接口的类,并且自动注册它们到事件总线中。当事件发生, 它通过依赖注入(DI)来取得处理器(handler)的引用对象并且在事件处理完毕之后将其。这是比较的事件总线使用方式于ABP中。2. 手动型(Manually)

  也可以通过手动注册事件的方式,但是会有些问题。在Web应用程序中,事件的注册应该要在应用程序启动的时候。当一个Web请求(request)抵达时进行事件的注册,并且反复这个行为。这可能会导致你的应用程序发生一些问题,因为注册的类可以被调用多次。同样需要注意的是,手动注册无法与依赖注入系统一起使用。

  ABP提供了多个事件总线注册方法的重载(overload)。最简单的一个重载方法是等待委派(delegate)或Lambda。

  因事件而被调用。这个方法也有一个非泛型的重载。另一个重载接受两个泛化的参数:

  于每个事件。当它的时候,它会调用ActivityWriter.Dispose方法。最后,你可以注册一个事件处理器工厂(event handler factory)来负责创建处理器。处理器工厂有两个方法:

  ,通过依赖注入系统,IocHandlerFactory可以用来创建或者(dispose)处理器。ABP可以自动化注册IocHandlerFactory。因此,如果你想要使用依赖注入系统,请直接使用自动化注册的方式。3.6.6 取消注册事件

  方法来取消某个事件所有处理器的注册,而UnregisterAll()方是所有事件的所有处理器。

  中,提供了通知服务。它是一个基于实时通知的基础设施。分为订阅模式和发布模式。 本次会在项目中使用发布模式来演示一个用户注册后,收到的欢迎信息。 发布模式 首先我们在领域层建立“I...

  入门系列目录——学习Abp框架之实操演练 一、先来介绍下仓储 仓储(Repository): 仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。 在ABP中...

  也快一年了,有过大半年的abp项目开发经验,目前项目中所用的abp框架版本为0.10.3,最新的abp框架已经到了1.4,并且支持了core。关于abp框架有哪些特性、有什么...