【发布时间】:2015-09-30 08:25:15
【问题描述】:
我正在编写一些看起来像这样的代码:
public class ManagerViewModel : ManagerViewModelBase
{
public ManagerViewModel(ISettingsProvider settingsProvider):
base(settingsProvider.Settings)
}
public class ManagerViewModelBase
{
private IEnumerable<string> _mySettings = Enumerable.Empty<string>();
public ManagerViewModelBase(IEnumerable<string> settings)
{
_mySettings = settings;
}
}
ISettingsProvider 是通过 Unity 提供的,如下所示:
public class SettingsProvider : ISettingsProvider
{
private readonly Service _service;
IEnumerable<string> _settings = Enumerable.Empty<string>();
public IEnumerable<string> Settings {get {return _settings}};
public SettingsProvider (
IService _service,
ISettingsProvider settingsProvider)
{
_service = service;
LoadSettings();
}
private void LoadSettings()
{
//_service just supplies the data
_service.GetSettings.Subscribe(LoadSettingsCompleted);
}
private void LoadSettingsCompleted(IEnumerable<string> settings)
{
_settings = settings;
}
}
问题在于,在实例化 SettingsProvider 时,可能需要一些时间才能从服务调用中获取结果,因此,在调用完成并填充 _settings 之前,会进行 base(settingsProvider.Settings) 调用, 基本上是传递一个空的枚举。
有没有办法让 SettingsProvider.Settings 属性调用等到来自 Service.GetSettings 调用的数据可用,并在一定时间后超时?我想我正在寻找最简单的方法来阻止该属性调用。
谢谢。
【问题讨论】:
-
如果您还没有给我们提供关键代码的定义,我们该如何提供帮助?
_service.GetSettings?IService的定义将是您问题的一个很棒的补充。 -
话说这段代码看起来很同步。通过添加异步响应式框架调用,您看到了什么优势?
-
您可能还想看看这个:blog.ploeh.dk/2011/03/03/InjectionConstructorsshouldbesimple,如果异步性很重要,为什么不考虑直接在接口本身上公开它作为
Task<IEnumerable<string>> GetSettings或类似的 - 如果您只返回一次设置。顺便说一句,我过去曾将设置直接公开为可观察对象,以便在成功的应用程序中立即获取对它们的更改。 -
@JamesWorld 我很想了解您过去如何将应用程序设置公开为可观察对象。
标签: c# system.reactive