听闻少年二字,当与平庸相斥。这篇文章主要讲述在 Reface.AppStarter 中使用事件总线相关的知识,希望能为你提供帮助。
大家对 设计模式 中的 监听者模式 肯定是非常熟悉的。
.Net 中的 事件 就是一个 监听者模式 很好的实践,你只需要以下几个步骤就可以实现这个功能
- 声明一个继承于 EventArgs 的事件参数
- 声明一个 event EventHandler< YourEventArgs> 的事件
- 在需要的时候,可以对事件进行触发
- 外部通过 += 操作监听事件
当我们的系统内的组件越来越多,事件的监听关系就会变得很复杂。
举个例子
我们为 WebApi 开发一个删除用户的功能,
我们首先想到的是,向 UserController 中添加一个 Delete 操作,传个 Id 什么的,然后调用 IUserService.DeleteById(id) 就搞定了。
但是想想看,用户这类数据,可不是说能删就能删的,不管怎么说,删除以前多少要考虑一下能不能删,删除以后也要考虑一下,有没有什么连带数据需要清理。
借鉴 监听者模式 的思路,我们很容易设计如一个带有事件的 IUserService
public class UserDeletingEventArgs : EventArgs
{
public int UserId { get;
set;
}
// 是否可以删除,事件的处理者可以将此置为 false
public bool CanDelete { get;
set;
}
// 当不能删除时的原因,由事件的处理者填写
public string DeletePreventedReason { get;
set;
}
}public interface IUserService
{
event EventHandler<
UserDeletingEventArgs>
Deleting;
event EventHandler<
UserDeletedEventArgs>
Deleted;
void DeleteById(int id);
}
如此一来,我们只要在实现 DeleteById 时触发两个事件即可
public void DeleteById(int id)
{
UserDeletingEventArgs userDeletingEventArgs = new UserDeletingEventArgs(id);
this.Deleting?.Invoke(this, userDeletingEventArgs);
if(!userDeletingEventArgs.CanDelete)
throw ......
// delete user
this.Deleted?.Invoke(this, new UserDeletedEventArgs(id));
}
通过上面的方法,我们轻松的构建了一个具有删除前后通知,并允许删除前拦截的 IUserService 。
然而,应用起来,往往并不乐观。
【在 Reface.AppStarter 中使用事件总线】当我们在 Controller 中创建了 IUserService (无论是基于注入、工厂还是 new 的) 后,我们无法知道这个系统里面都有谁需要监听这个事件。
于是我们无法在 Deleting 和 Deleted 中通知到所有的组件。
推荐阅读
- There's more to life than being happy
- 安卓逆向11.IDA以Debug模式调试APK SO
- PO设计模式在Appium中的应用——框架内容的补充
- unia-app页面声明周期
- RStudio IDE安装详细步骤(图解)
- R XML文件操作详细图解
- R while循环语句示例图解
- R和Python的区别详细对比(图解)
- R时间序列分析示例详解