当使用工厂的依赖注入时如何处理在对象实例化时间我们不知道依赖类型的情况?

时间:2011-12-08 16:17:02

标签: dependency-injection

我遇到过如何使用关键字导致难以测试代码的事实。对此的解决方案似乎是在构造函数中传递依赖项并仅在工厂中实例化对象。但是如果我们在对象实例化时不知道所有依赖项(或依赖项的类型)呢?如何处理此类案件?

例如,假设我们有一棵树可以有不同类型的节点。创建节点后,我们不知道它的类型。

2 个答案:

答案 0 :(得分:2)

如果在创建时无法确定传入的内容,则需要某种形式的Abstract Factory,尽管在服务和值类型之间绘制不应该有反向引用的行通常很有用。服务。

我为什么要回答一般性问题?因为你提出了一般性问题 - 如果你真的想得到一个有用的答案,请提供一个更具体和具体情况的例子,你正在寻找一个好的方法。

您尚未指定是否正在查看依赖性倒置原则或DI框架或Dependency management in libraries,它们具有相同的共同点,并且可以将它们分开。


我怀疑(即使你似乎没有触及.NET标签),正如@TrueWill所推荐的那样,优秀的Dependency Injection in .NET书将帮助你理解所涉及的微妙之处(无论使用何种语言或平台)你正在使用 - 本书的前面只是相当独立于技术的模式 - 只要优秀的例子具有真实的复杂程度就意味着这是可能的。)

答案 1 :(得分:1)

构造函数注入只是各种可能性之一。

您可以在IoC(Inversion of Control)容器中注册您的类型,并在需要时解决它们。

使用Microsoft的Unity应用程序块的.Net示例:

// When starting your application, you register your types:

var myContainer = new UnityContainer();
var logger = new Logger();
myContainer.RegisterInstance<ILogger>(logger);

// Later, when you need them, you can resolve them in your code:

var logger = myContainer.Resolve<ILogger>();