在我目前正在研究的系统中,我有许多定义为接口(interface)和基类的组件。系统的每个部分都有一些特定的点,它们与系统的其他部分进行交互。
例如,数据准备组件准备好一些最终需要去数据处理部分的数据,通信组件需要查询不同组件的状态以便中继到外部等。
目前,我使用“上帝对象”或对系统不同部分有深入了解的对象将系统的这些部分粘合在一起。它在这里注册事件并将结果传送到那里的方法,在这里创建一个回调方法并在那里返回该方法的结果,并通过多线程队列传递许多请求进行处理,因为它“知道”某些 Action 有在 STA 线程上运行,等等。
虽然它很方便,但让我担心的是,这种类型非常了解系统中的其他人是如何设计的。我更喜欢一个更通用的集线器,它可以提供可以公开事件、方法或回调的实例,或者可以使用这些实例。
我一直在看到更多关于响应式(Reactive)框架的 IObservable/IObserver 特性,这些特性正在被引入 .NET 4.0(我相信)。
我可以利用这种模式来帮助替换我的“上帝对象”吗?我该怎么做呢?是否有任何资源可以将此模式用于此特定目的?
最佳答案
看起来你可以用 MSDN 在这里描述的内容替换你的神对象:
我们的团队不会很快迁移到 .Net 4.0(不幸的是)。因此,我们通过构建类似于 MAF/MEF 提供的自定义框架来规避上帝对象场景。这使用 Microsoft 所谓的适配器创建了一个分布式知识库。每个适配器只负责自己的模块,传递数据、事件等。有一个通用的操作符来接收数据和事件,处理,并传回给各自的适配器。
我对 IObservable
和 IObserver
的理解让我相信上帝对象不是必需的——实际上创建了一个关于不同部分正在发生的事情的分布式知识库。这些接口(interface)的一个明显优势似乎还在于不再需要中间通信器(即适配器)。所以知识的分布真的是在IObservable派生类中。该模型固有地衍生出谈话者/响应者关系 - 没有中介/仲裁类。
关于.net - 如何利用 IObservable/IObserver 摆脱我的 "god object"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2275167/