管理IObservable依赖性

时间:2019-04-10 19:56:26

标签: c# dependency-injection architecture system.reactive

我有一个使用工厂创建的参数化Observable,即

// tick when the day changes in a given timezone
IObservable<DateTime> GetInstrumentTzDateRollObservable(string timeZoneName) 

在后台使用Observable.Timer,因此涉及成本,这意味着我不想创建太多这样的对象(示例已简化,现实生活中每个Observable的成本都高得多)。

现在,如果只有一个消费者,那么一切都很简单-我们将继续构建管道。但是订阅者是动态的,即用户可以打开一个需要相同数据的新屏幕。似乎我需要的是一种按时区缓存可观察对象的方法,以便使用者可以从此缓存中获取流(如果存在的话)(GetOrAdd)。简单的解决方案当然是一个类,其中包含这些可观察对象的字典。

我的问题是,没有一种更好的方式来共享这些中间流,方法是使用特殊的DI容器或类似的容器进行注册,以提供与上述缓存相同的功能。我对服务定位器反模式有足够的了解,除了实例化之外,没有对DI使用任何东西,因此似乎不建议这样做。尽管如此,我并没有真正看到自己的课程与DI容器有什么不同。

更新:根据要求,我想提供一个更现实的场景,即生成可观察元素的成本较高。我希望这个更清晰。

有一个数据库,可以保存所有仪器的数据。有一个加载器,可以按仪器检索数据。有一个通知流可以在数据更新时打勾。加载程序还需要日期来准备加载的数据。然后将结果显示为可观察的流:

    IObservable<IntrumentData> GetExpensiveDbDataStreamPerIntrument(string instrumentName)
    {
        // date provider ticks when a day in a given timezone changes prompting us to reload from source
        _dateProvider.GetInstrumentTzDateRollObservable(instrumentName)
            // combine with new data notifications to force a reload
            .CombineLatest(_newDataNotificationObservable.GetNotificationsForInstrument(instrumentName), (date, event) => date)
            .Select(date => _dataLoader.LoadData(instrumentName, date))
            // this has been expensive to load so we want to be able to share the result
            .Replay(1).RefCount();
    }

那么-当客户可以从一长串列表中选择和取消动态选择工具并使用需要相同工具数据的多个屏幕时,如何共享这些昂贵的数据流?

0 个答案:

没有答案