使用 IoC 容器时在哪里注册观察者?

Where to register observers when using IoC containers?

在我当前的应用程序中,我使用 'selfmade' Observable class 来实现观察者模式。观察者(实现接口)可以监听某些事件。

我正在将越来越多的项目切换到使用 IoC 容器,但我无法在代码中找到一个好的位置来将观察者注册到可观察对象。

我看到的实现方法是:

A) 将可观察对象注入观察者。
构造函数不应该做实际工作,但即使使用方法或字段注入,这也会将观察者与可观察对象耦合起来。反过来也是这样。

B) 创建一个可观察工厂并在那里执行。
在这种情况下,创建可观察对象取决于多个观察者的实现。

C) 通过工厂创建观察者并在那里进行。
虽然这对我来说似乎是关于耦合的最佳选择,但对于 DRY 来说却很糟糕。在某些情况下,工厂最终成为观察者的字段和构造函数的副本,加上可观察的和一行用于注册的代码。

有没有办法干净地处理这个注册?如果不是,是否有令人信服的论据来使用某种方式而不是其他方式?

解决方案是发现 Resolve() 和 Instantiate() 方法之间的区别。

我一直在使用 Resolve()。有了它,我将以绑定到容器的方式接收一个 Observer。

然而,Instantiate() 并不关心 class 是如何绑定到容器的。它以标准方式创建 class,但仍会注入依赖项。所以这个可以在工厂内部用于观察者。