我对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”的课程。但它没有我做任何类似的事情。是因为这些接口只有一个实现吗?如果我确实有多个实现然后只有我必须明确配置解决?
答案 0 :(得分:4)
您拥有的代码示例是Constructor Injection。
在传统的代码中,你会有一个无参数的构造函数,在其中你会像这样“新化”你的对象:
IEmailService emailService = new EmailService();
因此,您的代码明确地控制将哪个实现分配给接口变量。
在使用构造函数注入的IoC中,控制被反转,这意味着容器正在“驱动总线”并且正在创建TemplateEmailService对象。当它即将创建它时,容器会查看您的构造函数参数(IEmailService,ITemplateRenderer等)并将这些对象提供给您的类以供使用。
可以配置IoC容器,以便接口A由实现B(或C)显式实现。每个人都有办法做到这一点。或者它可以通过约定(IFoo由Foo实现),甚至是类中的属性,无论如何。
因此,要回答您的问题 - 您可以明确定义哪些实现用于实现某些接口。必须阅读有关如何使用的IoC容器文档。
还有一件事 - “当你这样编码时”,你在技术上不必使用IoC容器。实际上,您的类不应该直接引用容器 - 它将最大化可重用性,并且还允许轻松测试。因此,您可以将接口连接到其他地方的实现类。