- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正致力于构建一个 PHP 框架,该框架的行为符合 MVC 原则并利用依赖注入(inject)。我想我的前置 Controller 部分已关闭;有一个工作路由器实例化 Controller 实例并根据请求的 URI 调用适当的操作。
接下来是依赖注入(inject)。我想实现一个使用反射解决依赖关系的容器。在这样做时,我认为我的 Controller 遇到了问题。
有许多我称之为“系统依赖项”的东西需要对派生的 Controller 类可用。我实际上还没有创建所有这些依赖项,但 Controller 可以访问像 InputProvider(封装 get/post 参数或命令行参数)和输出依赖项这样的服务似乎是明智的。理想情况下,我会使用框架的容器将这些依赖项注入(inject) Controller 的构造函数中 - 但这是我遇到问题的地方。
如果我对 Controller 中的系统依赖项使用构造函数注入(inject),那么我将强制派生 Controller 管理基本 Controller 的依赖项(如果它们实现了自己的构造函数)。这似乎不是最人性化的。另一种选择是对系统依赖项使用 setter 注入(inject),但是如果派生 Controller 在其构造函数中需要这些系统依赖项,则它们将无法访问这些系统依赖项。
我看到的唯一一个两全其美的解决方案是让我的 Controller 成为单例。他们有一个私有(private)构造函数,这样我就可以安全地使用 setter 注入(inject),而不必担心派生类的构造函数。相反,会有一个可覆盖的 initialize() 方法(假设我让方法注入(inject)以某种方式工作),它基本上履行了构造函数的角色(如派生 Controller 的初始化程序)。这样,构造函数注入(inject)被 initialize() 方法中的方法注入(inject)所取代,所有系统依赖项都可用,而无需派生 Controller 来管理它们。
但是,快速谷歌搜索似乎一致认为单例 Controller 是不好的做法。我非常不确定如何进行。我可能过度设计了这一点,但除了希望我的应用程序面向 future 和可维护之外,我还认为这是应用最佳实践的一个小练习,所以我想“正确地”做事。
我认为在这种情况下的最佳实践是将管理所需系统依赖项的责任传递给派生 Controller 。如果派生 Controller 确实需要它,则可能只应实例化依赖项。如果派生 Controller 可能永远不会使用它,为什么还要在基础 Controller 中注入(inject) InputProvider 呢?但与此同时,我不断回到用户友好性,以及总是有一个可用的 $this->input
成员是多么美好,例如在像 CodeIgniter 这样的框架中。
我非常感谢对我的难题做出的所有贡献。我也为文字墙道歉,但我想不出任何代码示例可以使解释工作变得更容易,因为现在对我来说一切都太抽象了!
此致,
一个严重撕裂的人
最佳答案
有几种可能的解决方案:
禁止 Controller 使用__construct()
:将其设为private public final,并让 Controller 覆盖类似init()
的东西并从构造函数中调用它。然后构造函数将注入(inject)所有依赖项(反射?其他东西?),以便它们在 init()
中准备就绪。
您可以使用现有的 DI 库,例如 PHP-DI (免责声明:我致力于此)这将允许您定义依赖项,但让它们在构造函数中可用(神奇地,是的)。
类似的东西:
<?php
use DI\Annotations\Inject;
class FooController {
/**
* @Inject
* @var Bar
*/
private $bar;
public function __construct() {
// The dependency is already injected
$this->bar->sayHello();
}
public function setBar(Bar $bar) {
return $this->bar = $bar;
}
}
例如,这就是我使用 Zend Framework 1 的方式。我不能使用构造函数,所以我注入(inject)到属性中。这是 ZF1 integration project .
关于php - MVC和依赖注入(inject),被迫使用单例Controller?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14588011/
我在 gobject 上阅读了一个维基百科页面,上面写着, Depending only on GLib and libc, GObject is a cornerstone of GNOME and
如何注册一个依赖属性,其值是使用另一个依赖属性的值计算的? 由于 .NET 属性包装器在运行时被 WPF 绕过,因此不应在 getter 和 setter 中包含逻辑。解决方案通常是使用 Proper
我一直在尝试将 ActionbarSherlock maven 依赖项添加到我的项目中 com.actionbarsherlock library 4.2.0 在我的 po
http://tutorials.jenkov.com/ood/understanding-dependencies.html#whatis说(强调我的): Whenever a class A us
我对所有这些魔法有点不清楚。 据我了解,依赖属性是从 DependencyObject 继承的,因此存储值: 如果分配了值(在本地字典中),则在实例本身中 或者如果未指定值,则从指向父元素的链接中获取
我刚刚更新了在 ASP.NET Framework 4.5.2 版上运行的 MVC Web 应用程序。我正在使用 Twilio 发送 SMS 消息: var twilio = new TwilioRe
我刚刚发现了一件令人生畏的事情。 spring 依赖坐标有两个版本。 项目依赖于 spring mvc 和 spring flow。有两组并行的依赖项。 Spring MVC 具有以下方案的依赖项
我正在尝试包含 的 maven 依赖项 org.jacorb jacorb 2.3.1 依赖已解决,但它导致另一个依赖 picocontainer 出现问题: [ERROR
我正在尝试在 Haskell 项目中包含特定版本的库。该库是住宿加早餐型的(用于 martix 操作),但我需要特定的 0.4.3 版本,该版本修复了乘法实现的错误。 所以,我的 stack.yaml
有谁知道如何制作依赖的 UIPickerView.例如,当我选择组件一的第 2 行时,组件二的标题会发生变化吗? 我在互联网上查找过,没有真正的答案,我尝试过使用 if 和 switch 语句,但它们
我正在编写一个用于验收测试的项目,由于各种原因,这依赖于另一个打包为 WAR 的项目。我已成功使用 maven-dependency-plugin 解压 WAR,但无法让我的项目包含解压的 WEB-I
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
开始玩 Scala futures,我被依赖的 futures 困住了。 让我们举个例子。我搜索地点并获得 Future[Seq[Place]]。对于这些地点中的每一个,我搜索最近的地铁站(该服务返回
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
我有一个二进制文件,需要一些 *.so 文件才能执行。现在,当我尝试在一些旧机器上执行它时,它会显示 /lib/libc.so.6: version `GLIBC_2.4' not found 如何将
我尝试使用 Dygraph 来表示图表,我在 https://github.com/danvk/dygraphs 中找到了代码,但是它有太多的依赖文件,我觉得很烦人。是否有一个文件可以容纳所有必需的
我正在处理一个 javascript 文件,该文件 a) 声明一个具有函数的对象,并且 b) 使用它期望在外部声明的散列调用该对象的 init 函数。我的 Jasmine 规范提示它找不到哈希,因为它
最近我一直在学习 Angular 并且进展顺利,但是关于依赖注入(inject)的一些事情我仍然不清楚。 是否有任何理由在我的 app.js 文件中声明我的应用程序的其他部分(服务、 Controll
考虑一个名为 foo 的表,它有 id (PRIMARY & AUTO_INCREMENT) 列。我正在向该表中插入一行,挑战从此时开始。 $db->query("INSERT INTO `foo`
我正在使用级联下拉 jquery 插件。 (https://github.com/dnasir/jquery-cascading-dropdown) 我有两个下拉菜单。 “客户端”和“站点”。 根据您
我是一名优秀的程序员,十分优秀!