谁负责在无初始化依赖注入方案中附加侦听器?

时间:2009-04-19 18:07:02

标签: unit-testing dependency-injection

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

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

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

据我所知,这需要连接构建器或工厂中的所有侦听器,尽管这似乎与对象本身非常分离,并且很容易失去同步。另外(至少在动作脚本中,我现在花费了大部分时间),这意味着我的事件监听器不再是私有的,因为工厂/建造者需要看到它们。

处理此问题的最佳方法是什么?我还缺少另一种选择吗?

2 个答案:

答案 0 :(得分:1)

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

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

House不应对初始化Kitchen负责。这是别人的责任。 (可能是谁首先建造了厨房。)

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

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

答案 1 :(得分:1)

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

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