【发布时间】:2014-10-08 06:58:01
【问题描述】:
在学习依赖注入(并获得第一次实践经验)的过程中,我想知道在考虑一个我想在不久的将来使用 DI 解决的具体项目时遇到的一个问题。
对于不同的分析,我想动态创建注入依赖项的对象,因为我需要任意数量的对象,这可能会因用户与我的程序的交互而有所不同。我考虑将这个要求实现为抽象原型模式
public interface IAnalysis
{
SomeDataType DoSomething();
IAnalysis CreateObject();
}
从 IAnalysis 派生的类将负责从 CreateObject() 返回该类的新对象。依赖类可以在不知道具体类型的情况下创建新对象,但只依赖于接口,因此遵循了 DI 的一个主要概念。无论如何,从 IAnalysis 派生的类必须使用 new 关键字创建新对象。我读到使用 DI 时应避免在注入器外部使用 new 创建对象,因此我不太确定这在 DI 中是否“允许”。另一方面,这对我来说似乎是一个非常明智的解决方案,因为类只会创建自己的新对象,这实际上不应该损害 DI 原则。
我想到的这个概念合理吗?我可以使用其他解决方案来实现这一目标吗?我实际上考虑过抽象工厂,但这会损害我对 DI 原则的理解。
【问题讨论】:
-
我想知道您是否会混淆 DI 和 IoC。它们是相关的,但肯定不是一回事。 DI 要求从外部传入对象的依赖项,而不是在内部创建。没有什么可以阻止您通过其类型的构造函数创建依赖项。
-
不,我实际上是说 DI。我打算有一个注入器类来构建我的依赖关系图。这真的有影响吗?
-
Re: “我读到在使用 DI 时应该避免构造函数”。不;应该避免的不是构造函数本身,而是直接通过
new运算符调用它们。众所周知,构造函数在 DI 中非常有用(即用于注入所需的依赖项)。 -
@stakx 我可能应该写“[...] 应该避免在注射器之外”。当然需要它们,尤其是注入依赖项。
-
@PaulKertscher:那仍然是不准确的。我想指出构造函数和
new …表达式不是一回事。 (后者使用前者创建新对象;但new …表达式不是构造函数。)您阅读的建议很可能是关于new(因为只有那时是否有意义),但您将其引用为“我读到 constructors 应该……”。
标签: c# design-patterns dependency-injection prototype-pattern