我正在构建一个使用事件观察者模式的应用程序,以允许希望添加自己的功能的第 3 方供应商轻松扩展系统中的点。
这很好用,但它依赖于一件事:
- 我必须决定系统供应商中的哪些点可能希望扩展系统并在流程中的特定点触发事件。
供应商可能希望扩展我尚未触发事件的系统的不同部分,这是完全合理的。
这里有什么替代方案,以允许供应商从他们选择的系统中的任何点扩展系统 - 或尽可能接近该目标 - 使用类似于事件观察器的东西,即可以简单地挂接到选择的系统中?
我正在构建一个使用事件观察者模式的应用程序,以允许希望添加自己的功能的第 3 方供应商轻松扩展系统中的点。
这很好用,但它依赖于一件事:
供应商可能希望扩展我尚未触发事件的系统的不同部分,这是完全合理的。
这里有什么替代方案,以允许供应商从他们选择的系统中的任何点扩展系统 - 或尽可能接近该目标 - 使用类似于事件观察器的东西,即可以简单地挂接到选择的系统中?
好的,所以你需要做两件事。首先是出去寻找一些真正的客户,并与他们交谈。他们在哪里需要扩展?他们比你更清楚这一点。第二件事是在不提供钩子方面犯了错误。您可以随时添加它们,但您必须支持您发布的任何内容,即使它没有被使用。
正如@Holger 所说,没有办法为系统中的任何点提供任意挂钩,而且您确实不希望这样做。那是维护的噩梦。
Holger 已经提到 AOP 可以帮助你。您只需使用自定义注释来注释您的代码,并让您的客户定义他们自己的方面(他们将需要重新编译整个代码库)。例如:
@Data
public class Records {
@Saving
public void add(Record rec) {
// your code
}
}
稍后,您的客户可能会说“我希望每次有人保存一些数据时都被触发”。他将不得不用这个自定义“快捷方式”(伪代码)定义自己的“方面”:
@Aspect
public class OnSaving {
@Before("execution(* @Data @Saving(..))")
public void shortcut(JoinPoint pnt) {
// your customer's code
}
}
您的源代码不会更改,只是重新编译。我假设使用AspectJ。