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/