正确构造和销毁 Setter 依赖注入对象(可能使用 qt)
Correct Construction and Destruction of Setter Dependency Injected Objects (maybe with qt)
我正在使用QT,所以也许有更高级的选项或最佳实践方法。但是,如果有一个好的、通用的、与C++或语言无关的答案,那就太棒了!
我尝试正确构造和销毁由setter 依赖注入配置的对象,并且很难规划对象的生命周期。
在德国Microsoft博客上,有一个很好的比喻来讨论对象的依赖关系、职责和交互,我想改编一下:
有一个师傅-园丁和一个学徒-园丁
师傅要学徒去挖。一开始,学徒是用铲子建造的,所以他可以挖,但有人指责,制造自己的铲子对学徒来说责任太大了。
现在,在第二种方法中,主人可以使用一个漂亮的铲子工厂,生产优质,可测试的铲子。他继续说,告诉徒弟digWith(testableShovel)
。
现在在二传手依赖注射的背景下,我会让师傅告诉学徒takeShovel(testableShovel)
(二传手(,然后diggBoy()
让他挖掘。
问题来了,师傅忘了告诉徒弟拿铁锹,就像现在学徒没有工具可以挖一样。
为了处理这种情况,我想知道 - 学徒在建造时创建自己的非常基本的挖掘设备(例如一双手(是否合适?还是应该通过构造函数依赖注入(允许构造函数和依赖注入(来完成?创造/带一双手对徒弟的要求很大,我宁愿有一个nullptr
检查?
现在,让我们假设我的徒弟创造了自己的一双手,一旦他拿起铲子,谁会摧毁它们?一旦他放下铲子,谁来重新创建它们?如果学徒被搁置一旁,什么会被摧毁?
对于你的第一个问题:如果目标对象需要注入的对象来完成它的工作,那么它应该被注入到构造函数中。否则,对象在构造后将处于无效状态。或者,如果您在目标中执行某些依赖项的"基本"版本,那么您将引入依赖项注入首先试图避免的耦合。另一方面,如果依赖关系在某种程度上是可选的(例如,在某些情况下记录器可以被认为是可选的(,那么 setter 注入是完全可以的。
其次,我认为通过 setter 依赖注入提供给其他对象的对象的对象的所有权将取决于上下文。如果注入的对象是其他人不会使用的对象,则将std::unique_ptr
对象转移到目标。另一方面,如果其他人会使用它,那么你很可能会有一个std::shared_ptr
引用它。这里的关键是,使用现代"智能"指针将发出信号并强制执行注入对象的所有权。
- 如何在QT Creator上将QWidget声明为继承类的对象
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- Qt:从另一个窗口访问公共对象
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 如何在qt中将对象添加到现有布局中?--已解决
- 如何注册Qt C++对象以在QML中使用它
- 如何在Qt中连接来自不同窗口的两个对象?
- 将对象传递给多线程对象 Qt
- Qt:如何通知对象已建立涉及它的信号槽连接
- Qt访问每个类中的查看器对象?
- Qt调试:我如何知道QCoreApplication::notifyInternal2正在向哪个对象发送消息?
- Qt c++不会为所有对象调用move_slot.为什么?
- Qt对象所有权内存泄漏
- CMake + Qt,moc 编译失败,无法实现 QMetaObject 方法(编译器找不到基本 ui 对象的标头?
- 在Qt中执行完所有插槽后,如何释放对象
- 两个对象QT之间的示例插槽/信号
- 使用派生的类对象 Qt 访问基类信号
- 堆栈对象Qt信号和参数作为参考
- 重用QProcess对象(Qt 4.8)
- QWebEngine & QWebChannel:传输对象"qt.webChannelTransport"在页面重新加载后消失