Inversion of Control,一种设计思想,不是新的技术,用来减低计算机代码之间的耦合度。
常见的方式叫做依赖注入 Dependency Injection,简称DI
还有一种方式叫“依赖查找” Dependency Lookup

https://www.zhihu.com/question/335362570
https://baike.baidu.com/item/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC/1158025?fr=aladdin

IoC Inverse of Control,控制反转
IoC 指的是将对象的创建权交给 Spring 去创建。
使用 Spring 之前,对象的创建都是由我们使用 new 创建,而使用 Spring 之后,对象的创建都交给了 Spring 框架

AOP Aspect Oriented Programming,面向切面编程为内核
AOP 用来封装多个类的公共行为,将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,减少系统的重复代码,降低模块间的耦合度。另外,AOP 还解决一些系统层面上的问题,比如日志、事务、权限等

装饰器语法

尽可能使用面向对象的思想来编码,使用 class 机制能够方便的融入我们的新特性。
经过装饰器的修饰,形成了多个类,但是又不会相互耦合的局面,让独立开发,测试都非常的方便

IOC案例

代码中展示了两个 class,HomeController 依赖了 ReportService ,
可以看到其中没有任何实例化或者初始化的迹象,
业务代码也如同普通调用的那样直接,这都归功于依赖注入的魔法

  1. @provide()
  2. @controller()
  3. export class HomeController {
  4. @inject()
  5. reportService: IReportService;
  6. @get('/')
  7. async index(ctx) {
  8. ctx.body = await this.reportService.getReport();
  9. }
  10. }
  11. @provide()
  12. class ReportService implements IReportService {
  13. @inject()
  14. reporter: IReportManager;
  15. async getReport(id: number) {
  16. return await this.reporter.get(id);
  17. }
  18. }