:给定的像(C#温莎)的方案时,

似乎是一个IOC的标准方法

container.AddComponent<ILogger, HttpLogger>();
container.AddComponent<ILogger, SmtpLogger>();

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

将是解决该组件时,第一个注册的ILogger(HttpLogger在这种情况下)可以解决的唯一候选人,国际奥委会随后将找到“最胖”的构造也可以在那里它认为它可以解决所有的依赖。

但是,它很可能是国际奥委会无法解析第一个记录器的依赖,并将正是如此,分辨率问题返回,它很可能是,如果国际奥委会试了SmtpLogger可能得到解决的情况下。

那么,什么是只能使用第一个注册的服务作为候选的理由?似乎哪种类型的你会得到不确定性是一个说法,但随后国际奥委会被遗忘在电荷,构造器,它使用反正。

那么,为什么不从所有适用类型的所有构造函数回暖,并开始从最胖的构造函数试图解决下来(不可知的真正类型的)?

这可能有一个很明显的答案,但老实说,我不知道它。

在预先感谢 斯蒂芬。

有帮助吗?

解决方案

这样做的原因是其对实现复杂度的效果。

当这种行为被实现,它原来工作递归,例如找出可满足该记录器之一的依赖关系是否需要一个走下来的所有的及其的依赖等。

要有效地做到这一点是硬的,并增加了大量的复杂性,以在容器和所述调试体验。

MEF,而不是严格意义上的IoC容器,不这样做类似的方式你建议的 - 它是组成稳定行为的一部分,是我们所说的“拒绝”

HTTP ://blogs.msdn.com/nblumhardt/archive/2009/07/17/light-up-or-mef-optional-exports.aspx

在高动态插件方案中,排斥反应是极其有用的。在场景温莎,Autofac等的目标,所添加的努力不还清那么多。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top