我正在练习依赖注入,有几个问题,我不知道如何处理它们。
A类可能依赖于3-4个其他行为(接口)。一方面,在构造函数中传递它们会使对象更难创建和初始化。另一方面,如果客户端忘记设置其中一个依赖项,则使用setter可能会出现问题。处理这个问题的正确方法是什么?
最终,必须在某处创建所有依赖项。如何防止我在一个类中有很多初始化的情况(例如,主类)?
在进行依赖注入时使用shared_ptr是否是一种好习惯?在这种情况下,依赖项的创建者通常无法删除对象,因此使用共享指针对我来说很有意义。
答案 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)我个人赞成使用上面的引用并管理生命周期,以便依赖关系比依赖类更长,但是如果你想要忘记"那么可以使用共享指针。关于依赖关系一旦你使用它们。