依赖注入(DI)。这仅意味着将服务作为构造函数参数传入。为了将其传递到类中,必须已经存在一个服务,因此,两个服务无法相互依赖。在98%的情况下,这就是您想要的 (对于其他2%的情况,您始终可以创建一个setWhatever()
方法并稍后传递服务)。因此,DI与其他选项没有相同的耦合问题。它可以与多线程一起使用,因为每个线程可以简单地拥有每个服务的实例(并仅共享其绝对需要的实例)。如果您对此有所关注,它还可以使代码可进行单元测试。
依赖项注入的问题在于它占用了更多的内存。现在,类的每个实例都需要引用它将使用的每个服务。而且,当您有太多服务时,使用它会很烦人。有一些框架可以缓解其他语言中的此问题,但是由于C ++缺乏反思,因此C ++中的DI框架往往比手动完成更多的工作。
//Example of dependency injection
class Tower
{
private:
MissileCreationService* _missileCreator;
CreepLocatorService* _creepLocator;
public:
Tower(MissileCreationService*, CreepLocatorService*);
}
//In order to create a tower, the creating-class must also have instances of
// MissileCreationService and CreepLocatorService; thus, if we want to
// add a new service to the Tower constructor, we must add it to the
// constructor of every class which creates a Tower as well!
//This is not a problem in languages like C# and Java, where you can use
// a framework to create an instance and inject automatically.
请参阅此页面(来自C#DI框架Ninject的文档)以获取另一个示例。
依赖注入是解决此问题的常用方法,也是您在StackOverflow.com上最喜欢此类问题的答案。DI是控制反转(IoC)的一种。