标签:edr bapi als control 怎么 lse 应用 允许 lang
大家对 设计模式 中的 监听者模式 肯定是非常熟悉的。
.Net 中的 事件 就是一个 监听者模式 很好的实践,你只需要以下几个步骤就可以实现这个功能
但是
当我们的系统内的组件越来越多,事件的监听关系就会变得很复杂。
举个例子
我们为 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 。
然而,应用起来,往往并不乐观。
当我们在 Controller 中创建了 IUserService (无论是基于注入、工厂还是 new 的) 后,我们无法知道这个系统里面都有谁需要监听这个事件。
于是我们无法在 Deleting 和 Deleted 中通知到所有的组件。
标签:edr bapi als control 怎么 lse 应用 允许 lang
原文地址:https://www.cnblogs.com/ShimizuShiori/p/12634282.html