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

Several questions regarding Dependency Injection in C++

本文关键字:几个问题 注入 依赖 c++ 关于      更新时间:2023-10-16

我正在实践依赖注入,有几个问题,我不确定如何处理它们。

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

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

  3. 是否认为在进行依赖注入时使用shared_ptr是一种良好的实践?在这种情况下,依赖的创建者通常不能删除对象,所以使用共享指针对我来说是有意义的。

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

没有完美的解决方案,所以你必须调整自己的口味。选项包括:

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

  • 在运行时和编译时之间划分依赖关系,并使用派生/using/typedef("Policies"ala Modern c++ Design by Alexandrescu)来考虑编译时依赖关系

  • 为部分/所有依赖提供默认值,或者提供一些动态查找"服务",它仍然允许你修改注入,但在多个依赖对象结构中持续存在

对您的重复代码进行一点想象和分析,希望能为您提供一个方法....

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

这是一个分解冗余依赖创建和对象访问的问题——你的选择是类似的——传递引用或指针,使用结构体或容器或管理对象对它们进行分组并重新访问它们....

在进行依赖注入时使用shared_ptr是否被认为是一种良好的实践?在这种情况下,依赖的创建者通常不能删除对象,所以对我来说,使用共享指针是有意义的。

对于函数来说,客户端代码通常比被调用的函数的使用寿命更长,所以不需要共享指针…推荐信是最理想的。如果您正在使用线程,或者创建比客户端代码更长寿的对象,那么共享指针就很有意义。

这些都是我个人的意见,不过就这样吧。

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

2)如果你要经常使用相同的依赖集,你可以通过创建一个"依赖集"类来节省一些输入,它的一个实例可以传递给构造函数,像:
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;
};

我个人倾向于如上所述使用引用并管理生存期,以便依赖项比依赖类更长寿,但是如果您想在使用依赖项后"忘记"它们,则可以使用共享指针。