使用依赖注入时,在哪里放置所需的初始化代码?

时间:2012-03-20 11:53:15

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

当我的构造函数是纯粹的参数到propeties setter时,我不知道在哪里放置类需要正确工作的其他代码。

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

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

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

这些东西正确属于哪里?

  1. 在构造函数中
  2. .initialize()方法中的
  3. - 引入时间耦合
  4. WindowMessageControllerFactory.create(applicableWindow)中的
  5. - 对于如此重要​​的代码片段来说相当遥远。这意味着即使是这么小的一类也会分成两部分。
  6. 在组合根本身 - 这会在一直做的时候增加它的大小
  7. 在一些其他类WindowMessageRouter中只有一个方法,构造函数,带有此代码
  8. 修改

    这种情况似乎很特殊,因为应用程序中通常只有一个这样的控制器实例。但是在更一般化的情况下,如果我创建一个Button类的实例来覆盖一些DOM <button />元素,那么答案是什么?突然一个

    button = buttonFactory.create(domButtonEl);
    

    似乎更有用。

3 个答案:

答案 0 :(得分:2)

  1. 不要将任何实际工作放入构造函数中。构造者几乎不可模仿。请记住,接缝aka方法是可模仿的。构造函数不可模仿,因为继承和模拟。

  2. 初始化是一个禁止的词,非常一般。

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

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

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

  6. 编辑。 singetons没有什么特别之处,除非他们不控制自己的生命周期。

    黄金法则:总是(差不多)在应用程序布线和应用程序逻辑之间进行分离。工厂正在布线。只是接线,没有逻辑,因此无需测试。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我认为您需要创建一个负责事件分发的路由器类。此路由器应订阅所有事件并在控制器之间分发。它可以使用某种消息控制器映射,注入构造函数。