c++ - 正确构建和销毁 Setter 依赖注入(inject)对象(可能使用 qt)

标签 c++ qt dependency-injection qt5

I am using QT, so maybe there are more advanced options or best practice approaches. But if there is a good, general C++ or language agnostic answer that would be awesomest!

我尝试正确地构建和销毁由 setter 依赖注入(inject) 配置的对象,并且在规划对象的生命周期方面遇到了困难。

German Microsoft Blog 上一个很好的比喻来讨论对象之间的依赖关系、责任和交互,我想改编:

有一个园丁大师和一个学徒园丁
师傅要徒弟挖。一开始,学徒是拿着铲子 build 的,所以他可以挖,但有人指责,自己造铲子对学徒来说责任太大了。

现在,在第二种方法中,主人可以访问一家不错的铲子工厂,生产优质、可测试的铲子。他继续告诉学徒digWith(testableShovel)

现在在Setter Dependendy Injection的上下文中,我会让师父告诉学徒takeShovel(testableShovel) (setter) 然后diggBoy() 让他挖。

问题来了,师父忘记告诉学徒拿铲子,因为现在学徒没有工具可以挖。

为了处理这种情况,我想知道 - 学徒在施工时创造自己非常基本的挖掘设备(例如一双手)是否合适?还是应该通过构造函数依赖注入(inject)来完成(同时允许构造函数和依赖注入(inject))?创造/带来一双手对学徒来说太过分了,我宁愿有一个nullptr-check?


现在,假设我让我的学徒创造了自己的双手,一旦他拿起铲子,谁会破坏它们?一旦他放下铲子,谁会重新创造它们?放下徒弟,会毁掉什么?

最佳答案

对于您的第一个问题:如果目标对象需要注入(inject)的对象来完成其工作,那么它应该被注入(inject)到构造函数中。否则,构造后对象将处于无效状态。或者,如果您在目标中执行某些依赖项的“基本”版本,那么您将引入依赖项注入(inject)首先试图避免的耦合。另一方面,如果依赖在某种程度上是可选的(例如,在某些情况下,记录器可以被认为是可选的),那么 setter 注入(inject)就完全没问题了。

其次,我认为通过 setter 依赖注入(inject)将对象的所有权赋予其他对象将取决于上下文。如果注入(inject)的对象是其他人不会使用的对象,则将它的 std::unique_ptr 传输到目标。另一方面,如果其他人要使用它,那么您可能会有一个 std::shared_ptr 引用它。这里的关键是现代“智能”指针的使用将发出信号并强制执行注入(inject)对象的所有权。

关于c++ - 正确构建和销毁 Setter 依赖注入(inject)对象(可能使用 qt),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45707248/

相关文章:

qt - QVector 有最大尺寸吗?

properties - 如何使用 CDI 从 .properties 文件 @Inject 值

c++ - 如何使用 dynamic_bitset<> 复制位

c++ - 如何从 udp 套接字 (C/C++) 获取您自己的(本地)IP 地址

qt - QIcon/QImage 内存泄漏?

qt - 停止行为 - QML

c++ - 将拆分后的字符串分配给子字符串

c++ - GoogleTest for Android NDK C++ with CMake

c# - 在 IServiceCollection 扩展中获取服务

java - CDI:从外部库向 bean 注入(inject)资源