[转]如何实现 IoC 容器和服务提供者是什么概念

IoC 容器和服务提供者

上一节我们的代码还是没有完全达到解偶,假如我们项目里有很多功能用到了这个login功能,我们则在这几个页面反复写。但是突然我们有一天换需求了,觉得数据库记录日志不太好,想要改成文件的,那我们不是每个页面用到login功能的都去替换成new FileLog()呢?,那改如何修改呢?

我们可以借助一个容器,提前把log,user都绑定到Ioc容器中。User的创建交给这个容器去做。比如下面这样的,你再任何地方使用login。都不需要关心是用什么记录日志了,哪怕后期需要修改只需要在ioc容器修改绑定其他记录方式日志就行了。

具体代码实现的思路

  1. Ioc容器维护binding数组记录bind方法传入的键值对如:log=>FileLog, user=>User
  2. 在ioc->make(‘user’)的时候,通过反射拿到User的构造函数,拿到构造函数的参数,发现参数是User的构造函数参数log,然后根据log得到FileLog。
  3. 这时候我们只需要通过反射机制创建 $filelog = new FileLog();
  4. 通过newInstanceArgs然后再去创建new User($filelog);

这里的容器就是指Ioc容器,服务提供者就是User。

对啦,上一节遗留一个问题如果参数是接口该怎么处理,其实就是通过Ioc容器提前绑定好。

核心IoC容器代码编写

至此,我们的IoC就已经实现了。

Laravel中的服务容器和服务提供者

可以在config目录找到app.php中providers,这个数组定义的都是已经写好的服务提供者

« »

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *