【问题标题】:Trying to understand IOC and binding试图了解 IOC 和绑定
【发布时间】: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


【解决方案1】:

您的代码示例是Constructor Injection

在传统代码中,您将拥有一个无参数构造函数,并且您可以在其中“新建”您的对象,如下所示:

IEmailService emailService = new EmailService();

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

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

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

所以回答您的问题 - 您可以明确定义用于实现某些接口的实现。必须阅读 IoC 容器文档以了解如何操作。

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

【讨论】:

  • 谢谢你的解释:)。这很有帮助。
猜你喜欢
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
相关资源
最近更新 更多