试图了解IOC和绑定

时间:2012-03-15 18:51:43

标签: c#-4.0 dependency-injection inversion-of-control ioc-container structuremap

我对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天,但是从我读过的所有教程中,我都希望自己能够配置一些名为“Resolve IParent to Child”的课程。但它没有我做任何类似的事情。是因为这些接口只有一个实现吗?如果我确实有多个实现然后只有我必须明确配置解决?

1 个答案:

答案 0 :(得分:4)

您拥有的代码示例是Constructor Injection

在传统的代码中,你会有一个无参数的构造函数,在其中你会像这样“新化”你的对象:

IEmailService emailService = new EmailService();

因此,您的代码明确地控制将哪个实现分配给接口变量。

在使用构造函数注入的IoC中,控制被反转,这意味着容器正在“驱动总线”并且正在创建TemplateEmailService对象。当它即将创建它时,容器会查看您的构造函数参数(IEmailService,ITemplateRenderer等)并将这些对象提供给您的类以供使用。

可以配置IoC容器,以便接口A由实现B(或C)显式实现。每个人都有办法做到这一点。或者它可以通过约定(IFoo由Foo实现),甚至是类中的属性,无论如何。

因此,要回答您的问题 - 您可以明确定义哪些实现用于实现某些接口。必须阅读有关如何使用的IoC容器文档。

还有一件事 - “当你这样编码时”,你在技术上不必使用IoC容器。实际上,您的类不应该直接引用容器 - 它将最大化可重用性,并且还允许轻松测试。因此,您可以将接口连接到其他地方的实现类。