Dependency injection 使用依赖项注入时,将所需的初始化代码放在何处?

Dependency injection 使用依赖项注入时,将所需的初始化代码放在何处?,dependency-injection,factory-pattern,constructor-injection,abstract-factory,Dependency Injection,Factory Pattern,Constructor Injection,Abstract Factory,当我的构造函数是属性设置器的纯参数时,我不确定在哪里放置类正常工作所需的其他代码 例如,在JavaScript中,我正在编程一个WindowMessageController,它处理window对象上的message事件 为了使其工作,我必须在某个地方附加处理程序: var controller = this; this.applicableWindow.addEventListener("message", function(event) { controller.messageAct

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

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

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

var controller = this;
this.applicableWindow.addEventListener("message", function(event) {
    controller.messageAction(event.data);
} 
这些东西正确地属于哪里?

  • 在构造函数中
  • 在.initialize()方法中-引入时间耦合
  • 在WindowMessageControllerFactory.create(ApplicatableWindow)中——对于如此核心的代码来说,这是一个相当遥远的地方。这意味着即使是这样一个小类也会被分成两部分
  • 在构图根本身中,这将使其大小成倍增加
  • 在另一个类WindowMessageRouter中,该类只有一个方法,即构造函数,并带有此代码
  • 编辑

    这种情况似乎很特殊,因为在一个应用程序中通常只有一个这样的控制器实例。然而,在更一般的情况下,如果我创建了一个封装在某个DOM
    元素上的
    按钮
    类的实例,那么答案是什么?突然

    button = buttonFactory.create(domButtonEl);
    

    似乎更有用。

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


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

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


    编辑回复:是的,这个工厂似乎是我最好的选择。顺便说一句,不要忘记工厂可能应该有一个dispose方法(即在按钮出现时取消绑定事件处理程序)…

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

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

  • 不要向施工人员投入任何实际工作。构造函数很难被模仿。记住,方法是可以模仿的。构造函数不可模拟,因为继承和模拟

  • Initialize是一个禁止使用的词,非常普遍

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

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

  • 通常,我们使用的是Javascript。如果您只需要一个工厂方法,为什么需要类呢?记住,函数是第一类对象

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

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

  • 不要向施工人员投入任何实际工作。构造函数很难被模仿。记住,方法是可以模仿的。构造函数不可模拟,因为继承和模拟

  • Initialize是一个禁止使用的词,非常普遍

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

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

  • 通常,我们使用的是Javascript。如果您只需要一个工厂方法,为什么需要类呢?记住,函数是第一类对象

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

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