在ABP框架中详细描述域层中的域事件域事件
在应用程序系统中,域事件用于解耦和重用(重用)业务逻辑。
事件总线
事件总线是单个对象的一个对象,它由所有其他类共享,并且可以由它触发和处理:
获取默认实例(获取默认实例)
你可以使用eventbus。默认直接。它是一个全球性的事件总线,可以用如下:
EventBus.Default.Trigger(…); / /触发事件
注射ieventbus事件接口(注ieventbus)
除了使用eventbus。默认直接,你也可以使用依赖注入(DI)获得ieventbus参考。这是单元测试的好。在这里,我们使用属性注入范式:
公共课taskappservice:applicaservice {
公共ieventbus eventbus {有};集;
公共taskappservice(){
eventbus = nulleventbus。实例;
}
}
事件总线注射,它更适合使用属性注入到构造器注入。事件是由类和事件对象的描述是从EVENTDATA继承。假设我们想触发事件完成任务后:
公共课taskcompletedeventdata EVENTDATA {:
public int taskId设置;} {得到;
}
在这个类中包含的属性都需要由类当处理一个事件,事件数据类定义的属性(EventSource对象触发此事件)和eventtime(触发时)。
定义事件
公司定义了一个abphandledexceptiondata事件自动触发此事件发生异常时,这是特别有用当你想获得有关异常的更多信息(即使有自动记录所有的例外),你可以登记这一事件并将其设置为触发当异常发生的时间。
公司还提供实体变化很多通用的事件数据类:entitycreatedeventdata,entityupdatedeventdata,和entitydeletedeventdata。他们在abp.events.bus.entitis命名空间定义。当一个特定的实体添加/更新/删除,这些事件自动触发ABP。如果你有一个个人的实体,可以注册entitycreatedeventdata,事件将被触发时,新的个人实体的创建和插入到数据库中。这些事件也支持继承。如果学生从人类继承,你登记在entitycreatedeventdata,那么你将加入的人或学生受到触发。
触发事件
触发事件的示例如下:
公共课:应用服务taskappservice {
公共ieventbus eventbus {有};集;
公共taskappservice(){
eventbus = nulleventbus。实例;
}
公共无效completetask(completetaskinput输入){
在数据库上完成了任务。
EventBus . Trigger(新taskcompletedeventdata { taskId = 42 });
}
}
有一些沉重的触发方法:
EventBus . Trigger(新taskcompletedeventdata { taskId = 42 });
EventBus . Trigger(这一点,新的taskcompletedeventdata { taskId = 42 });
EventBus . Trigger(typeof(taskcompletedeventdata),这样,新的taskcompletedeventdata { taskId = 42 });
事件处理
处理事件,你应该实现ieventhandler界面如下:
公共课activitywriter:IEventHandler,itransientdependency {
public void HandleEvent(taskcompletedeventdata EVENTDATA){
writeactivity(完成一项任务的ID =+事件数据。taskId);
}
}
eventbus已经集成到一个依赖注入系统。我们itransientdependency在上面的例子中,当taskcompleted事件被触发时,它将创建的activitywriter类的新实例并调用它的handleEvent方法,然后释放它。有关详细信息,请参阅狄第。
1。基本事件的处理(处理基本事件)
eventbus支持事件的继承。例如,您可以创建taskeventdata两继承类:taskcompletedeventdata和taskcreatedeventdata:
公共课taskeventdata EVENTDATA {:
公共任务任务{ get;set;}
}
公共课taskcreatedeventdata:taskeventdata {
公共用户creatoruser {有};集;
}
公共课taskcompletedeventdata:taskeventdata {
公共用户completoruser {有};集;
}
然而,你可以实现ieventhandler处理两事件:
公共课activitywriter:IEventHandler,itransientdependency {
public void HandleEvent(taskeventdata EVENTDATA){
如果(事件数据是taskcreatedeventdata){
…
其他{ }
…
}
}
}
当然,你也可以实现ieventhandler处理所有的事件,如果你真的想这样做。
2。处理多个事件(处理多个事件)
在一个单处理器(处理器),我们可以处理多个事件。在这一点上,你应该实施不同的事件ieventhandler。例子如下:
activitywriter公共类:
IEventHandler,
IEventHandler,
itransientdependency
{
public void HandleEvent(taskcompletedeventdata EVENTDATA){
处理事件
}
public void HandleEvent(taskcreatedeventdata EVENTDATA){
处理事件
}
}
登记处理
我们需要将处理器(处理程序)注册到事件总线中来处理事件。
1。自动自动
ABP扫描所有的类实现ieventhandler接口和自动登记到事件总线。当事件发生时,它得到的处理器(处理器)的引用对象的依赖注入(DI)和释放事件后完成。这是一个比较推荐的方式使用事件总线在ABP。
2。手动(手动)
你也可以手动登记事件,但会有一些问题。在web应用中,事件的注册应用程序时应当启动开始,活动时注册Web请求(request)的到来,和行为是重复的。这可以在你的应用程序引起的问题,因为注册类可以引用了很多次,也要注意,手动注册不能使用依赖注入系统的重要。
ABP提供了重载的多事件总线注册方法(重载),最简单的重载方法之一是等待委托或lambda。
(EVENTDATA = > eventbus登记。
{
writeactivity(完成一项任务的ID =+事件数据。taskId);
});
因此,事件:任务完成后会发生和LAMBDA方法会被调用。二重载方法等,实现了IEventHandler的一个对象:
eventbus。登记(新activitywriter());
在上述例子中,如果activitywriter称为事件。这种方法也有一个非泛型重载。另一个重载接受两个综合参数:
eventbus登记();
在这一点上,事件总线为每个事件创建一个新的activitywriter。当它被释放,它调用Dispose方法activitywriter。
最后,你可以登记一个事件处理程序工厂创建一个处理器,处理器厂有两种方法:那么GetHandler和ReleaseHandler。示例如下:
公共课activitywriterfactory:ieventhandlerfactory {
市民IEventHandler GetHandler(){
返回新的activitywriter();
}
ReleaseHandler(IEventHandler handler){ public void
/ /待办事项:发布activitywriter实体(处理器)
}
}
公司还提供了一个特殊的工厂类,iochandlerfactory,其中,依靠喷射系统,可用于创建或释放(处置)processors.abp可以自动登记iochandlerfactory。因此,如果你想使用依赖注入系统,直接使用自动配准方法。
注销登记事件
当您手动注册事件总线时,您可能希望在这之后取消注册:
注册事件
var = eventbus登记。登记(EVENTDATA = writeactivity(任务由=身份+事件数据。taskId完成));
取消事件的注册
登记。处置();
当然,取消注册可以在任何地方进行。保存(保留)已注册良好的对象,并在取消注册时处理它。所有注册方法的重载(重载)将返回一个可释放的对象(一次性)取消该事件的注册。
事件总线还提供了取消注册的方法:
创建处理器
VAR处理=新activitywriter();
注册事件
eventbus登记(处理);
取消事件注册
eventbus Unregister(处理);
它还提供了一个重载的方法来取消委托和工厂。取消注册的处理器对象必须与以前注册的对象相同。
最后,eventbus提供unregisterall()取消事件的所有处理器的注册方法,而unregisterall()方法是所有事件的所有处理器。