将对象引用传递给构造函数,这是DI吗?

时间:2014-07-28 12:23:01

标签: c# design-patterns dependency-injection

作为一名新手,我现在正在学习DI。我读过的所有例子都是安静复杂的接口等。但是在这里我看到了一个答案(有150个upvotes)DI简单地说:

public A(B b)
this.b=b;

即。将B传给A。

这是对的吗?

1 个答案:

答案 0 :(得分:4)

这是依赖性倒置,是的。 (控制反转,依赖注入等等都可以追溯到Dependency Inversion Principle。)

简单地说,如果一个对象依赖于另一个对象(或外部资源),那么它应该要求提供该另一个对象(或外部资源)的实例而不是在内部创建它。这方面的一个例子是在构造函数中需要一个对象。

(无耻的自我推销:我碰巧有一个名为"What Is Dependency Injection?"的旧介绍性演示文稿,你可能会觉得有帮助。)

编辑:下面的评论提出了B在您的示例中是具体还是抽象类型的观点。理想情况下,它应该是抽象类型。如果它是具体类型,您仍然会反转B内部功能的依赖性,但您还没有完全删除依赖项。您仍然可以对B进行更改,这些更改需要您重新编译并重新分发A

如果B是抽象的,那么您可以将任何具体实现提供给A,并且它不关心您使用哪一个。{1}}。如果B具体,那么A仅与特定的实施相关联。