【问题标题】:C++ dependency injection - by reference or by boost::shared_ptr?C++ 依赖注入 - 通过引用还是通过 boost::shared_ptr?
【发布时间】:2011-04-20 15:31:13
【问题描述】:

在需要构造函数依赖注入的情况下,使用 by reference 注入与使用 boost::shared_ptr 的注意事项是什么?

还有其他常见的方法吗?与上述两种方法相比如何?

【问题讨论】:

标签: c++ dependency-injection pass-by-reference shared-ptr


【解决方案1】:

您可以选择如何管理要注入的对象的生命周期。整体架构可能会决定哪种选择最有意义。有了引用,更高层次的东西必须管理对象的生命周期;使用shared_ptr 将自动管理生命周期。

【讨论】:

    【解决方案2】:

    以前我用过这两种方法。

    使用共享指针方法的优势意味着您可以将注入依赖项的所有权传递给消费者。

    如果您使用基于引用的方法,则注入的依赖项的销毁更具确定性。 IE。它会在消费者中的所有处理完成后发生。

    【讨论】:

      【解决方案3】:

      我记得看到一些使用unique_ptr(或者可能是auto_ptr)的代码。这似乎比“通过引用”更好:不需要管理注入对象的所有权。这可能比使用shared_ptr 更快:不涉及引用计数。不过,这可能更令人困惑:它涉及所有权转让,而auto_ptr 有一些陷阱。

      【讨论】:

      • unique_ptrauto_ptr 不给你共享对象的可能性。同样,这是否会成为问题取决于整体架构。
      • 如果对象拥有(不共享)注入的对象,这是一个不错的选择。
      【解决方案4】:

      您需要问自己的问题是:谁拥有该对象?在典型的 DI 场景中,它是消费者对象。在这种情况下,我会将原始指针传递给构造函数并将其存储到类似unique_ptr 的内容中。如果所有权是共享的或不清楚的,当然可以使用shared_ptr

      【讨论】:

      • 嗯?它应该从不成为 DI 中的消费者 - 如果其他对象也需要使用该实例怎么办?
      • @BlueRaja:严格来说,它可以是任何一种方式 - DI 与聚合与组合的困境正交。
      • 我永远不会传递 RAW 指针。如果没有其他方法将指针包装在智能指针中,可以提供有关传递 RAW p 的对象应该发生的事情的文档(在源代码中);指针只是可怕且令人困惑。
      • @Martin:你会将什么样的智能指针传递给正在获取动态分配对象所有权的容器的构造函数?
      • 我投票赞成在做出这样的决定时同时考虑所有权和范围。
      猜你喜欢
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 2016-09-26
      • 2016-12-28
      相关资源
      最近更新 更多