作为一名新手,我现在正在学习DI。我读过的所有例子都是安静复杂的接口等。但是在这里我看到了一个答案(有150个upvotes)DI简单地说:
public A(B b)
this.b=b;
即。将B传给A。
这是对的吗?
答案 0 :(得分:4)
这是依赖性倒置,是的。 (控制反转,依赖注入等等都可以追溯到Dependency Inversion Principle。)
简单地说,如果一个对象依赖于另一个对象(或外部资源),那么它应该要求提供该另一个对象(或外部资源)的实例而不是在内部创建它。这方面的一个例子是在构造函数中需要一个对象。
(无耻的自我推销:我碰巧有一个名为"What Is Dependency Injection?"的旧介绍性演示文稿,你可能会觉得有帮助。)
编辑:下面的评论提出了B
在您的示例中是具体还是抽象类型的观点。理想情况下,它应该是抽象类型。如果它是具体类型,您仍然会反转B
内部功能的依赖性,但您还没有完全删除依赖项。您仍然可以对B
进行更改,这些更改需要您重新编译并重新分发A
。
如果B
是抽象的,那么您可以将任何具体实现提供给A
,并且它不关心您使用哪一个。{1}}。如果B
具体,那么A
仅与特定的实施相关联。