IOC介绍
Controller
就是对不同的请求,相应的调用不同的Service的具体实现。
Service
负责具体的业务逻辑,调用Repository 来做增删改查。
Repository
数据库的增删改查操作,封装了数据源,依赖DataSource连接数据库。
DataSource
连接数据库,依赖Config拿到账号密码等信息。
Config
配置文件,用来配置数据库账号密码等信息。
问题
Controller 依赖了 Service 实现业务逻辑,Service 依赖了 Repository 来做增删改查,Repository 依赖 DataSource 来建立连接,DataSource 又需要从 Config 对象拿到用户名密码等信息。
js
const config = new Config({ username: 'xxx', password: 'xxx'});
const dataSource = new DataSource(config);
const repository = new Repository(dataSource);
const service = new Service(repository);
const controller = new Controller(service);
我们需要手动构造对象,并将依赖传入,十分麻烦
IOC怎么解决
之前我们手动创建和组装对象不是很麻烦么,我能不能在 class 上声明依赖了啥,然后让工具去分析我声明的依赖关系,根据先后顺序自动把对象创建好了,然后组装起来呢?
它有一个放对象的容器,程序初始化的时候会扫描 class 上声明的依赖关系,然后把这些 class 都给 new 一个实例放到容器里。 创建对象的时候,还会把它们依赖的对象注入进去。
具体
- 定义类时,使用 @inject @Controller装饰器声明
- 将Provider和Container类,放入@Module的类装饰器中
- 在构造函数参数上直接声明依赖(属性注入也行)
- nest会帮我们将我们声明的依赖注入到构造函数中