下面我们一起观察一个 ioc container 的实际应用 .. 在命令行的下面 .. 安装一个包 .. adonis install @adonisjs/redis ..
这个包为应用提供了 redis 数据库的功能 .. 安装了这种包以后,需要再去注册一下这个 provider .. 就是告诉应用一声,应用里面多了这个 redis 功能 .. 复制一下这个 provider 的位置 ..
注册应用的 provider ,打开 start 下面的 app.js ... 把它粘贴到 providers 里面 ..
安装了某些包以后,可能会提供一些额外的东西,比如这个 redis 提供了一个配置文件 .. 位置是 config 下面的 redis.js ...
安装包的时候可以使用 npm 或者框架的 adonis 命令 .. 如果使用 adonis 命令安装包,包里面提供的一些额外的东西会放在各自的目录的下面 .. 但是如果你要使用 npm 去安装,需要的这些东西需要手工去创建 ..
这个 redis.js 里面是 redis 数据库的相关的一些配置 .. 这些配置会在 redis 包里面用到 ..
为应用安装的包,都会放在 node_modules 的下面 .. 刚才安装的 redis 是在 @adonis.js .. 找到 redis ..
观察一下这个包里的文件的结构 ..
里面会有一个 providers 目录 .. 这个就是 service provider 的位置 .. 在这些 service provider 里面,可以注册绑定东西到应用的 ioc container 里面 ..
打开这里的 RedisProvider.js ..
ServiceProvider 都会继承 @adonisjs/fold 这个包里的 ServiceProvider 类 ..
它里面会有一个 register 方法 .. 在这个方法里可以把一些东西绑定到应用的 ioc container 里面 ..
绑定的时候,可以使用 this.app 下面的 bind ,或者 this.app 上的 singleton 这两个方法 .. this.app 表示的就是 ioc 对象 ...
这里先用了 bind ,在 ioc container 里面绑定了一个叫 Adonis/Addons/RedisFactory 的东西 .. bind 方法的第一个参数就是绑定在 ioc container 里的东西的名字 ..
它是一个命名空间 .. 一般有几个部分组成 .. 里面你可以加上自己的名字 .. 主要就是为了避免命名冲突 ..
bind 方法的第二个参数是个回调 .. 在这个方法里面,你可以组织一下真正要往 ioc container 上面绑定的东西 .. 你可以在这个方法里解决一下依赖,返回最终需要绑定的东西 ..
使用在 ioc container 里的东西,可以使用 ioc 对象上的 use 方法 .. 或者直接使用 use 这个方法 ..
每次 use 这个 RedisFactory 的时候,都会执行这个 require .. 载入 RedisFactory 这个模块 ..
下面这块,又用了一个 ioc 上的 singleton 绑定了一个 Adonis.Addons/Redis ..
在第二个方法参数里面 .. 最终会返回一个 Redis 实例 .. 这个 Redis 实例有一些依赖,所以在绑定的时候要先解决这些依赖,比如它依赖一个 RedisFactory ..
还有它会依赖应用的 Config ... 它为 Redis 提供了获取配置数据的功能 ..
新建 Redis 实例的时候,把它需要的 Config ,还有 RedisFactory 交给了它 ..
使用 singleton 的好处就是,应用只会创建一个 Redis 实例 .. 不然如果使用 bind 方法的话,每次从 ioc container 里面提取使用这个 Adonis/Addons/Redis,它都会给我们创建一个新的 Redis 实例 ..
绑定的东西也可以设置一个别名 .. 这样使用它的时候会更简单一些。这里用了 alias 这个方法,设置了一下 Adonis/Addons/Redis 的别名,叫 Redis ..
这样在想要使用这个 Redis 的地方,可以直接使用 use 方法,名字就是这个 Redis ..
打开 src ... Redis .. 下面的这个 index.js ...
这个文件里定义了一个 Redis 类 .. 你会发现,这个类需要 Config 还有 Factory ...
在把它绑定到应用的 ioc container 里的时候,我们已经解决了它的依赖 ..