使用 IoC 容器时在哪里注册观察者?
Where to register observers when using IoC containers?
在我当前的应用程序中,我使用 'selfmade' Observable class 来实现观察者模式。观察者(实现接口)可以监听某些事件。
我正在将越来越多的项目切换到使用 IoC 容器,但我无法在代码中找到一个好的位置来将观察者注册到可观察对象。
我看到的实现方法是:
A) 将可观察对象注入观察者。
构造函数不应该做实际工作,但即使使用方法或字段注入,这也会将观察者与可观察对象耦合起来。反过来也是这样。
B) 创建一个可观察工厂并在那里执行。
在这种情况下,创建可观察对象取决于多个观察者的实现。
C) 通过工厂创建观察者并在那里进行。
虽然这对我来说似乎是关于耦合的最佳选择,但对于 DRY 来说却很糟糕。在某些情况下,工厂最终成为观察者的字段和构造函数的副本,加上可观察的和一行用于注册的代码。
有没有办法干净地处理这个注册?如果不是,是否有令人信服的论据来使用某种方式而不是其他方式?
解决方案是发现 Resolve() 和 Instantiate() 方法之间的区别。
我一直在使用 Resolve()。有了它,我将以绑定到容器的方式接收一个 Observer。
然而,Instantiate() 并不关心 class 是如何绑定到容器的。它以标准方式创建 class,但仍会注入依赖项。所以这个可以在工厂内部用于观察者。
在我当前的应用程序中,我使用 'selfmade' Observable class 来实现观察者模式。观察者(实现接口)可以监听某些事件。
我正在将越来越多的项目切换到使用 IoC 容器,但我无法在代码中找到一个好的位置来将观察者注册到可观察对象。
我看到的实现方法是:
A) 将可观察对象注入观察者。
构造函数不应该做实际工作,但即使使用方法或字段注入,这也会将观察者与可观察对象耦合起来。反过来也是这样。
B) 创建一个可观察工厂并在那里执行。
在这种情况下,创建可观察对象取决于多个观察者的实现。
C) 通过工厂创建观察者并在那里进行。
虽然这对我来说似乎是关于耦合的最佳选择,但对于 DRY 来说却很糟糕。在某些情况下,工厂最终成为观察者的字段和构造函数的副本,加上可观察的和一行用于注册的代码。
有没有办法干净地处理这个注册?如果不是,是否有令人信服的论据来使用某种方式而不是其他方式?
解决方案是发现 Resolve() 和 Instantiate() 方法之间的区别。
我一直在使用 Resolve()。有了它,我将以绑定到容器的方式接收一个 Observer。
然而,Instantiate() 并不关心 class 是如何绑定到容器的。它以标准方式创建 class,但仍会注入依赖项。所以这个可以在工厂内部用于观察者。