我的图书馆应该知道 Reactive Extensions 吗?

Should my libraries be aware of Reactive Extensions?

我对 .NET 的响应式扩展越来越感兴趣。由于我的应用程序涉及数据采集系统,很可能甚至核心 类 和我的域库的概念也会受益于使用 Rx 概念。

我的疑问是:我是否应该 "contaminate" 我的域模型具有 Rx 类型和接口?或者我应该保留它 "clean",仅在客户端代码中使用 Rx?

一方面,清洁架构的支持者(主要是 Bob 大叔)提倡 "thou shalt not depend on the framework",这是有道理的。

另一方面,我已经在.NET中开发了,它本身就是一个框架,而Rx似乎已经来了。例如,David West 提倡系统中 80% 的 类 应该来自库,只有大约 20% 应该是手工编码的并且特定于系统本身。我相信这就是 Python 如此成功的原因,也是 "batteries included" 方法,图书馆方面的。

所以,从实用的角度来说,在蛋糕中使用 Rx 的实际方法是:将它洒在上面,还是直接混合到面团中?

与对此类问题的所有回答一样; "it depends".

它取决于什么?

  • 谁是目标消费者或您的图书馆?
  • 您要解决的问题的性质是什么?

如果你的目标消费者是内部的,或者更好的是,只有你,那就做你喜欢的事。说真的。

但是,如果其他人将使用您的库(例如 public,依赖 Nuget),那么您还有其他考虑因素。 如果你的库的本质是一些 Async 方法,而你恰好更喜欢 Rx 而不是 Task,那么我实际上会错误地保留 Task。如果你依赖 Rx,那么你的客户也会。如果您的客户端碰巧依赖另一个库,而这个库又依赖于不同版本的 Rx,那么,那会很有趣。

但是,如果您的库显示的是真正的 "streaming" 数据点集,那么将这些点公开为 IObservable 可能会很有用。但是,如果您不在内部使用 Rx,那么我会再次远离 Rx 依赖。您可以公开带有回调参数的方法或普通的旧 .NET 事件成员。如果消费者想要使用 Rx,那么 Observable.Create 将很容易地将您的 API 调整为 Rx。