【问题标题】:Where to put needed initialization code when using Dependency Injection?使用依赖注入时在哪里放置所需的初始化代码?
【发布时间】:2012-03-20 11:53:15
【问题描述】:

当我的构造函数是纯参数到属性设置器时,我不确定将类需要正常工作的其他代码放在哪里。

例如,在 JavaScript 中,我正在编写一个 WindowMessageController 来处理 window 对象上的 message 事件。

为了让它工作,我必须在某处附加处理程序:

var controller = this;
this.applicableWindow.addEventListener("message", function(event) {
    controller.messageAction(event.data);
} 

这些东西正确属于哪里?

  1. 在构造函数中
  2. 在 .initialize() 方法中 - 引入时间耦合
  3. 在 WindowMessageControllerFactory.create(applicableWindow) 中 - 对于如此核心的代码段来说,这是一个相当遥远的地方。这意味着即使是这么小的班级也会被分成两部分。
  4. 在组合根本身中 - 这会在一直执行时增加其大小
  5. 在其他一些类 WindowMessageRouter 中,只有一个方法,即构造函数,使用此代码

编辑

这种情况看起来很特别,因为在应用程序中通常只有一个这样的控制器实例。然而,在更普遍的情况下,如果我创建一个 Button 类的实例,它会包裹一些 DOM <button /> 元素,那么答案是什么?突然一个

button = buttonFactory.create(domButtonEl);

似乎更有用。

【问题讨论】:

    标签: dependency-injection factory-pattern constructor-injection abstract-factory


    【解决方案1】:
    1. 不要将任何实际工作放入构造函数中。构造函数很难模拟。请记住,接缝又名方法是可模拟的。构造函数不可模拟,因为继承和模拟。

    2. Initialize 是一个禁止词,非常笼统。

    3. 也许可以,但是如果你害怕很多类,你也可以将工厂实现为类的静态方法,)

    4. 组合根只是一个普通的工厂。除了它只有一个,因为你的应用可能只有一个入口点,)

    5. 常见,我们使用的是 Javascript。如果您只需要一种工厂方法,为什么还需要类呢?请记住,函数是一流的对象。

    用于编辑。 singington 没有什么特别之处,除非它们不控制自己的生命周期。

    黄金法则:始终(几乎)将应用程序连接和应用程序逻辑分开。工厂正在布线。只是接线,没有逻辑,因此无需测试。

    【讨论】:

      【解决方案2】:

      我会将此代码放入 initialize(window) 方法中,但该方法不能成为 WindowMessageController 的公共 API 的一部分 - 它必须是可见的并由 直接用户(所以组合根和测试)仅限。 因此,当 DI 容器返回 WindowMessageController 实例时,容器负责调用 initialize 方法。

      回复编辑:是的,这家工厂对我来说似乎是最好的方式。顺便提一句。不要忘记工厂应该有一个 dispose 方法(即在 button 的情况下取消绑定事件处理程序)...

      【讨论】:

        【解决方案3】:

        我认为您需要创建一个负责事件分发的 Router 类。这个 Router 应该订阅所有事件并将它们分发给控制器。它可以使用某种消息控制器映射,注入到构造函数中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-06
          • 2016-07-23
          • 1970-01-01
          • 2016-04-06
          • 1970-01-01
          • 1970-01-01
          • 2015-02-23
          相关资源
          最近更新 更多