关于C ++中依赖注入的几个问题

时间:2014-03-26 07:11:07

标签: c++ oop dependency-injection

我正在练习依赖注入,有几个问题,我不知道如何处理它们。

  1. A类可能依赖于3-4个其他行为(接口)。一方面,在构造函数中传递它们会使对象更难创建和初始化。另一方面,如果客户端忘记设置其中一个依赖项,则使用setter可能会出现问题。处理这个问题的正确方法是什么?

  2. 最终,必须在某处创建所有依赖项。如何防止我在一个类中有很多初始化的情况(例如,主类)?

  3. 在进行依赖注入时使用shared_ptr是否是一种好习惯?在这种情况下,依赖项的创建者通常无法删除对象,因此使用共享指针对我来说很有意义。

2 个答案:

答案 0 :(得分:2)

  

A类可能依赖于3-4个其他行为(接口)。一方面,在构造函数中传递它们会使对象更难创建和初始化。另一方面,如果客户端忘记设置其中一个依赖项,则使用setter可能会出现问题。处理这个问题的正确方法是什么?

没有完美的解决方案,所以你只需要调整品味。选项包括:

  • 让/ a构造函数接受一个对注入对象进行分组的结构(如果你将同一组依赖项传递给许多构造函数)

  • 在运行时和编译时之间划分依赖关系,并使用派生/ using / typedef(“策略”ala现代C ++设计由Alexandrescu)计算出编译时依赖性

  • 为某些/所有依赖项提供默认值,或者某些动态查找“服务”仍允许您修改注入但在多个依赖对象构造中保留

对你的重复代码进行一些想象和分析,希望能给你一个方法......

  

最终,必须在某处创建所有依赖项。我如何防止在一个类中有很多初始化的情况(例如,主类)?

这是一个考虑冗余依赖项创建和对象访问的因素 - 您的选择是相似的 - 传递引用或指针,使用结构或容器或管理对象对它们进行分组并重新访问它们。

  

在进行依赖注入时使用shared_ptr是否是一种好习惯?在这种情况下,依赖项的创建者通常无法删除对象,因此使用共享指针对我来说很有意义。

对于函数,通常客户端代码必须比被调用函数的使用寿命更长,因此不需要共享指针......引用是理想的。如果你正在使用线程,或创建可以比客户端代码更长的对象,那么共享指针就会很有意义。

答案 1 :(得分:0)

所有个人意见,但我们去了。

1)将依赖项传递给构造函数。如果存在合理的默认值,则提供多个构造函数或使用默认参数。

2)如果你经常使用同一组依赖项,你可以通过创建一个"依赖集来保存自己的一些输入。 class,其实例可以传递给构造函数,如:

struct Iface1;
struct Iface2; // Dependent interfaces
struct Iface3;

struct DependencySet
{
    Iface1& iface1;
    Iface2& iface2;
    Iface3& iface3;
};

class Dependent
{
public:
    Dependent(DependencySet& set)
        : iface1(set.iface1)
        , iface2(set.iface2)
        , iface3(set.iface3)
    {}

private:
    Iface1& iface1;
    Iface2& iface2;
    Iface3& iface3;
};

3)我个人赞成使用上面的引用并管理生命周期,以便依赖关系比依赖类更长,但是如果你想要忘记"那么可以使用共享指针。关于依赖关系一旦你使用它们。