Kid*_*ond 5 php dependency-injection controller
我正在用 PHP 制作我自己的原始 MVC 框架,我想知道我应该在哪里加载/实例化相应的控制器依赖项?
在每个控制器的构造函数中(紧耦合)还是注入它们(松散耦合)?
我不太确定的后者的唯一部分是在注入之前在 MVC 范式之外的引导级别实例化依赖项。除了默认的父级控制器之外,并非每个控制器都使用完全相同的依赖项。我必须将它们全部实例化,这也会产生大量开销。
我已经看到一些现有的框架$this->load->model('model'); // CodeIgniter在构造函数中这样做,但我不知道他们为什么这样做。
我建议您注入依赖项,这样您的控制器与框架的耦合就会减少。这将使切换到另一个框架变得更容易。
关于实例化依赖项:我建议您使用(或实现)依赖项注入容器。该容器应该包含可以实例化服务的工厂。
在理想情况下,您的控制器也是服务(这意味着它们在依赖项注入容器中也有工厂)。
这样,只有特定请求所需的控制器才会被实例化,因此只有其依赖项才会被实例化。
当构建您自己的框架时,这意味着在路由阶段之后(当知道正确的控制器时),框架应该从容器中获取该控制器。容器本身将确保提供所需的所有依赖项。
查看Pimple,了解简单依赖注入容器的示例。
PS:CodeIgniter 中的那行代码看起来很像服务定位器模式。此模式类似于依赖注入,但不提供完全的 控制反转。
| 归档时间: |
|
| 查看次数: |
983 次 |
| 最近记录: |