【发布时间】:2012-03-15 18:51:42
【问题描述】:
我对 IOC 的概念非常陌生,我理解它们可以帮助我们在不同的上下文中解决不同的类别。您的调用类将仅与 Interface 和 Interface 交互,并决定为您提供哪个实现,并负责更新对象。
如果我的理解有误,请纠正我,因为我的问题是基于此:
现在,我在这些项目中经常看到这种模式:
private readonly IEmailService emailService;
private readonly ITemplateRenderer templateRenderer;
private readonly IHtmlToTextTransformer htmlToTextTransformer;
public TemplateEmailService(IEmailService emailService,
ITemplateRenderer templateRenderer,
IHtmlToTextTransformer htmlToTextTransformer)
{
this.emailService = emailService;
this.htmlToTextTransformer = htmlToTextTransformer;
this.templateRenderer = templateRenderer;
}
我知道这有助于使用这些类的所有实现,而无需更新它们,而且您不必决定要获得哪个实现,您的 IOC 会为您决定,对吗?
但是当我像这样编码时,我什至不接触任何 IOC 配置文件。我再次使用 git 仅 2 天,但从我读过的所有教程中,我希望我自己配置一些内容,上面写着“将 IParent 解析为 Child”类。但它不需要我做任何类似的事情。是因为这些接口只有一个实现吗?如果我确实有多个实现,那么只有我必须明确配置解析?
【问题讨论】:
-
好吧,我想..当特定接口只有一个实现时,IOC 会自行解决(至少结构图会这样做)。只有当有多个实现时,您才需要进行显式配置。
-
一些 IoC 和 DI 框架也使用“约定优于配置”范式。因此,如果您有接口 IFoo 和实现此接口的类 Foo,那么即使您有其他实现 IFoo 的类,框架也会将 IFoo 解析为 Foo 而无需任何配置。实际上它可能更复杂,但这是主要思想。据我所知,它最初是在 Ruby On Rails 中发明的,结构图也支持它 (codebetter.com/jeremymiller/2009/01/20/…)
标签: c#-4.0 dependency-injection inversion-of-control ioc-container structuremap