2017-08-16 127 views
0

我正在使用QT,所以也许有更高级的选项或最佳实践方法。但是,如果有一个好的,一般的C++或语言不可知的答案,那将是最棒的!正确构建和破坏注入器依赖注入对象

我试图让由的setter依赖注入正确的配置,并有挣扎规划对象的生命时对象的构造和析构。

在一个German Microsoft Blog一个很好的比喻来讨论对象之间的依赖关系d,责任和互动,我想适应:

有一个主园丁和学徒,园丁
主希望学徒挖掘。一开始,徒弟正在建造一把铲子,所以他可以挖掘,但有人指责说,制造自己的铲子对于学徒来说太过责任。

现在在第二种方法中,主人可以访问一个漂亮的铲车工厂,生产质量可测试的铲子。他继续告诉学徒digWith(testableShovel)

现在二传手Dependendy注射的方面,我先给师傅告诉徒弟takeShovel(testableShovel)二传手),然后diggBoy()让他掏。

问题出现了,当主人忘记告诉学徒采取铲子,因为现在学徒没有工具挖掘。

为了处理这种情况,我想知道 - 学徒在施工时是否创建了自己非常基础的挖掘设备(如一双手)?或者应该通过构造函数依赖注入来完成(允许构造函数和依赖注入)?创造/带来一双双手要求学徒,我宁愿有一个nullptr - 检查?


现在,让我们假设我有我的徒弟创立了自己的一双手,谁必摧之,一旦他拿起铁锹的?一旦他放下铁锹,谁会重新创造它们?如果徒弟被放在一边,什么会被毁灭?

回答

1

第一个问题:如果目标对象需要注入的对象来完成它的工作,那么它应该注入构造函数中。否则,在施工后你会使对象处于无效状态。或者,如果您在目标中执行某些依赖关系的“基本”版本,那么您首先会引入依赖注入试图避免的耦合。另一方面,如果依赖关系在某种程度上是可选的(例如,在某些情况下记录器可能被认为是可选的),那么setter注入就完全没问题。其次,我会争辩说,通过setter依赖注入赋予其他对象的对象的所有权将取决于上下文。如果注入的物体是其他人不会使用的物体,则将其转移到目标上。另一方面,如果其他人打算使用它,那么你可能会有一个std::shared_ptr的引用。这里的关键是使用现代的“智能”指针将发出信号并强制执行注入对象的所有权。

+0

我还没有涉及智能指针的话题。我想,这是我阅读和拥抱的东西。谢谢你到目前为止。只要我完全理解你的答案(在那之前没有更好的答案),我会将其标记为已接受。在此之前(希望非常接近未来),* Thank You *和* + 1 *就足够了。 – derM