Jas*_*vis 9 php registry dependencies dependency-injection
我正在开发OO PHP中的社交网络类型项目,我不想使用现有的框架.这个项目的主要目的是帮助我了解更多的东西.
这个问题更多的是关于依赖注入.
假设我有这些课程:
核心类 - 在app
配置类中执行操作的一些核心方法- 加载站点配置
数据库类 - 连接到mysql并执行所有数据库相关的东西
记录器类 - 用于记录错误和调试信息验证
码类 - 用于表单
会话类上的验证码 - 启动会话启动并添加,删除,获取要在应用程序
缓存类中使用的会话变量- 类似于会话类但对于缓存项(文件缓存,内存缓存,apc缓存.我甚至可能有一天将我的会话内容添加到此类中所有这些缓存都可以使用相同类型的方法)
上面的所有类很可能会在我的应用程序中的每个页面加载时使用(我可能会错过更多将在稍后添加的类)
现在除了需要注入大多数其他类的上述类之外,我还会有更多的类.我将有一个名为模块的部分,它将具有类似......的东西
帐户类 - 创建新用户,对用户进行身份验证,将用户登录和导出应用程序,更新用户设置等等.
用户类 - 显示用户个人资料,显示用户在线,新用户,显示网站
论坛类用户的所有内容- 将用于论坛部分
博客课程 - 用于博客部分
照片课程 - 所有照片相关内容
评论类 - 处理评论用于照片和个人资料
对于网站的不同部分,将会有更多这类类型.
上面列出的第二组类很可能需要将第一组中的大多数类注入其中.
那么我应该使用注册表来存储第一组类中的对象,并将注册表注入第二组类中的所有类对象?
或者我应该使用构造函数来加载它们?在这个例子中,有7个对象可以注入到其他类中,这似乎很多.我错了吗?
---编辑---
我知道单身模式,但我不认为这是我最好的选择
---编辑2 ---
正如有些人提到的,需要传入多达7个对象似乎很多,这就是为什么我在寻找建议.幸运的是,这个项目处于起步阶段,所以现在是改变结构的时候了.
一个例子是我论坛部分的一个类.论坛类需要访问会话数据,可能的缓存数据,配置对象,数据库对象.我错了吗?
kei*_*ant 11
或者我应该使用构造函数来加载它们?在这个例子中,有7个对象可以注入到其他类中,这似乎很多.我错了吗?
当您开始需要注入那么多对象时,您需要询问接收它们的对象是否负责太多.它可以分解成更小的碎片吗?
如果它真的不能,那么考虑将相关对象封装在另一个类中.也许你的会话,记录仪,并配置对象可以被注入App或Application对象?
编辑:我注意到目前为止大多数其他答案都在谈论单身人士.请注意,单身人士是DI 的敌人.伟大的谷歌技术在这里谈论这个.
编辑2:
我通过封装IS,而不是注入的意思Session,Logger,Config,等所有进入你的Account课,也许他们应该被注入Application类和Application实例可以注入Account.
老实说,这仍然是我的一部分我正在把我包裹起来,但我开始看到的是:你应该只注入Account它将直接需要操纵的对象.这些对象可能需要操纵其他对象,但Account不需要知道它.
通常,你会发现你甚至不需要像你想象的那么多"层".如果您发现自己正在注入各种东西,请考虑各种方法来重新构建您的应用程序.让我从模型上的Pylons文档中提取一段代码:
a = model.Person()
a.name = "Aaa"
a.email = "aaa@example.com"
meta.Session.add(a)
Run Code Online (Sandbox Code Playgroud)
(不要担心meta.Session......基本上它处理与数据库的交互.)
在这里,我们实例化a Person,设置它的一些属性,然后保存它.您会注意到Person该类对数据库一无所知,实际上甚至没有save()方法.相反,我们将它传递给meta.Session保存它的数据库类().我们Person将对逻辑的关注与数据库代码分开. meta.Session可以使用十几种不同的方式,但只要它知道如何阅读Person,我们就没事了.(在这种情况下,在应用程序初始化期间,它会读取所有应用程序模型的定义).
好的,我要总结一下,因为我在这里显然已经漫步了很多.你的问题没有一个"正确"的答案(据我所知,但我不会以任何方式宣称成为DI专家).
是的,注入几个对象可能表明需要进行重组,但您需要考虑以下因素:
Account对象可以注入你的Database而不是相反吗?