【问题标题】:Who is responsible for attaching listeners in a no-initialization dependency injection scheme?谁负责在非初始化依赖注入方案中附加监听器?
【发布时间】:2009-04-19 18:07:02
【问题描述】:

我一直在阅读 Misko Hevery 的 Guide: Writing Testable Code

我绝对相信依赖注入是提高可测试性的好工具,并在我的代码中大量使用它。但是,在阅读指南“Flaw #1: Constructor does Real Work”的第一部分时,我发现我仍然对您应该如何连接事件侦听器有点模糊。

假设我有一个类,为了正常工作,需要将侦听器附加到通过构造函数依赖注入传入的参数之一。根据指南,构造函数应该只将它的参数分配给成员变量,而不做其他工作。此外,当构造函数完成时,对象应该被完全初始化。但是,在这种情况下,除非需要连接侦听器,否则我不会认为对象已完全初始化。

据我所知,这需要连接构建器或工厂中的所有侦听器,尽管这似乎与对象本身非常分离,并且很容易失去同步。此外(至少在 actionscript 中,我这些天大部分时间都在使用它),这意味着我的事件监听器不能再是私有的,因为工厂/构建器需要看到它们。

处理此问题的最佳方法是什么?我这里还有其他选择吗?

【问题讨论】:

  • 监听器对象的生命周期是多少?它们的寿命是否比您的主要对象长?如果它们的生命周期比主对象短,则不应通过构造函数传入。

标签: unit-testing dependency-injection


【解决方案1】:

将业务逻辑(调用图)与对象创建分离

具体来说:如果House 需要初始化Kitchen 才能正常运行,则应将初始化的Kitchen 传递给House 构造函数。

House 不应该负责初始化Kitchen。那是别人的责任。 (可能是最初建造厨房的人。)

但是,有一个小问题:如果对象的生命周期比House 短,则它不属于成员变量。例如:PersonOwner 可能不应该通过构造函数传入。它应该通过函数调用传入。

Misko's latest article on managing object lifetimes talks about this subject.

【讨论】:

    【解决方案2】:

    一种常见的模式是将连线移动到 initialize() 或 start() 方法中,并利用依赖注入容器的生命周期机制来确保调用该方法。

    在我当前的项目中,我们将注释与 Spring 和 Spring.NET 的 bean 后处理器结合起来,将事件侦听器连接到方法。

    【讨论】:

      猜你喜欢
      • 2011-07-27
      • 1970-01-01
      • 2018-09-27
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      相关资源
      最近更新 更多