2013-10-16 78 views
0

我开始基于Observable模式创建一个日志系统。为此我使用Reactive Extensions。 我有一个名为ILogInfo的IObservable和一个名为ILogObserver的IObserver。 我有一个使用共享库的各种模块的主应用程序。每个模块都实现了一个ILogInfo观察器,这些模块可以并行工作。我的问题在于,我想仅观察在我的模块范围内注册的ILogInfo。每个应用程序模块的多个记录器实例

Scheme Application

在此方案中,我有两个模块(模块A和模块B),每个模块使用经由ILogInfo推送信息许多文库。当LibC推送一个新的ILogInfo时,我希望只有调用模块能够捕获(观察)这些信息。例如,当呼叫来自模块B时,我不需要模块A观察到的信息。我怎么能这样做?

+0

如何在ILogInfo中设置'发件人'字段?然后你可以将日志推送到公共总线上,并且消费者可以使用logBu​​s.Where(l => l.Sender == moduleA) – 3dGrabber

+0

过滤流。感谢您的评论,但是如果我这样做,我必须将发件人信息转发目前我有太多的库来考虑这个解决方案。 –

回答

1

这不是真的关于Rx的问题。您需要能够从ILogInfo获取调用上下文以适当地路由它。

你可以提供显式地从调用者提供该上下文(注释中的发送者建议看起来像是一个简单的,可行的建议),或者做一个昂贵的stackwalk来确定调用模块(这不会在异步情况),否则你必须通过设置LogicalCallContext中的数据来维护调用者的ExecutionContext - 这在更异步的情况下工作,但更复杂。

我不知道您的具体情况,但考虑到需要隔离日志如此彻底,我想知道是否在单独的每个模块AppDomains中托管多个库的副本可能更容易,从而使您完全隔离。

我希望这个需求有一个非常好的理由,因为当现有的日志框架具有提供上下文的良好解决方案时(例如在日志应用程序块和WCF中的活动跟踪),感觉非常复杂。

+0

谢谢詹姆斯的回答。我们决定隔离AppDomain中的每个模块。这更简单,更安全,而且效果非常好:)。它只是为了找到我们如何在AppDomain之间交换数据,因为我们有一个集中不同模块间信息的库。 –

0

我同意詹姆斯在这里。这不是一个真正的Rx问题。

我也有一个问题,你将如何处理记录哪些模块引用同一个库的地方?

是否有一个原因,你没有考虑像Log4Net这样的常见Logging解决方案?

+0

你说的对,詹姆斯,这不是一个Rx的问题,我改变了我的问题标题。 –

+0

我们不使用Log4Net,NLog或其他日志记录解决方案,因为我们不想依赖特定的日志库。我们发现使用Rx的主要优点是我们可以为一个模块实现许多Observer,这个模块可以使用NLog记录信息或将它们写入控制台或将它们显示在用户界面中。 –

+0

我明白这个想法。然而,我会认为一个简单的ILogger接口包装实现就足够了。然后,您只需使用类别和侦听器来观察日志。 –