【发布时间】:2009-10-31 02:05:59
【问题描述】:
向上还是向下?
我是一个非常有眼光的人。我将我的应用程序视为一个层次结构,其中顶部是根,底部是叶子。
我还了解到 IoC 容器不知道其包含的对象的职责/功能。相反,包含的对象通过一些抽象接口知道它们的容器,即“上下文”。
UP:(非 IoC 方式?) 我的事件是否应该从我的层次结构的底部分派并通过责任链模式向上冒泡到它们的父级,以便包含的对象不知道它们的容器?例如。我的 GUI 中的一个按钮调度了一个 CLICKED 事件,该事件被一个侦听容器捕获,该窗口通过关闭自身来响应。
DOWN:(国际奥委会方式?) 我的事件是否应该由容器从我的层次结构的顶部分派并到达已直接订阅容器的包含的侦听器,以便容器不知道它们的内容?例如。容器窗口调度一个 CLOSED 事件,该事件由包含的按钮对象直接接收,这些按钮对象通过关闭自身来响应,然后窗口也随之关闭自身。
“Up”对我来说似乎很自然,但由于 IoC 有一个容器不知道其包含的对象的行为,所以我不想响应它们的事件。
我意识到几乎可以让系统的任何部分监听事件,但我想了解 IoC 参与者之间的基本关系,这样我才能正确地构建它们。我假设人们通常不会只是散布关于他们的程序的事件而不考虑结构关系、依赖关系等。
我的问题来自 IoC 系统中的职责放置——调用容器是包含对象的责任,而容器有责任为其依赖对象提供服务(这颠倒了非 IoC 范式——因此同义词“依赖倒置”)。这似乎是 IoC 的一个非常重要的基本组成部分——职责的转移。我认为调用一个对象的函数或监听它的事件都是依赖另一个对象的例子。当一个对象基于另一个对象定义自己的行为时,我称之为依赖关系,因为一个对象知道另一个对象,也知道另一个对象做什么。它已经在另一个对象的上下文中定义了自己。据我了解,IoC 的设置是为了使包含的对象依赖于容器,因此包含的对象应该有责任了解容器的所有信息。容器不应该负责了解包含的对象。因此,让 CONTAINER 监听 CONTAINED 注入对象上的事件在我看来就像是职责错位,因为这意味着它知道一些关于它的内容。
在学习了 Dependency 'Injection' 和 'Inversion' 不同之后,这个问题被重新表述了。找到上一个问题here。
【问题讨论】:
标签: oop events inversion-of-control dependencies