2009-04-19 57 views
3

我一直在阅读Misko Hevery的Guide: Writing Testable Code谁负责在无初始化依赖注入方案中附加侦听器?

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

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

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

处理这个问题的最佳方法是什么?我在这里错过了另一个选项吗?

+0

监听器对象的生命周期是什么?他们活得比你的主要对象长吗?如果它们比主对象的生命周期短,则不应通过构造函数传递它们。 – Runcible 2009-05-04 18:45:08

回答

1

独立从对象创建

具体业务逻辑(调用图):如果需要House为了初始化的Kitchen正常工作,初始化的Kitchen应传递到House构造。

House不应该负责初始化Kitchen。这是别人的责任。 (可能是谁建立了厨房的第一名。)

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

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

1

一个常见的模式是将布线移动到一个初始化()或启动()方法,和把你的依赖注入容器的生命周期的机制的优势,以确保该方法被调用。

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