我有一个单身IObservable,返回Linq查询的结果。我有另一个类监听IObservable来构造消息。该类是通过MEF导出的,我可以将其导入并从Linq查询中获取异步结果。MEF和IObservables
我的问题是,在初始组合发生后,当提供给Linq查询的数据发生更改时,我没有对更改进行任何通知。我在单例中实现了INotifyPropertyChanged,认为它为新的IObservable创建导出的类重新请求,但是这不会发生。
也许我不理解关于MEF容器的生命周期或关于属性通知的内容。我会很感激任何帮助。
下面是单例和导出的类。我遗漏了一些可以推断的代码片段,比如PropertyChanged事件处理程序等。完全可以这么说,当底层会话数据发生变化时,它确实有效。 Singleton引发UsersInCurrentSystem的更改事件,但从UsersInCurrentSystem属性中不会有任何新的IObservable请求。
public class SingletonObserver: INotifyPropertyChanged
{
private static readonly SingletonObserver _instance = new SingletonObserver();
static SingletonObserver() { }
private SingletonObserver()
{
Session.ObserveProperty(xx => xx.CurrentSystem, true)
.Subscribe(x =>
{
this.RaisePropertyChanged(() => this.UsersInCurrentSystem);
});
}
public static SingletonObserverInstance { get { return _instance; } }
public IObservable<User> UsersInCurrentSystem
{
get
{
var x = from user in Session.CurrentSystem.Users
select user;
return x.ToObservable();
}
}
}
[Export]
public class UserStatus : INotifyPropertyChanged
{
private string _data = string.Empty;
public UserStatus
{
SingletonObserver.Instance.UsersInCurrentSystem.Subscribe(sender =>
{
//set _data according to information in sender
//raise PropertyChanged for Data
}
}
public string Data
{
get { return _data; } }
}
}
代码示例中有很多奇怪的东西:你有一个空的静态构造函数,一个LINQ查询,它等同于'Session.CurrentSystem。用户','UserStatus'构造函数声明中缺少括号,'SingletonObserver.Instance'可能应该是'SingletonObserver.SingleteonObserverInstance'的引用......我放弃了试图理解它。 – 2012-03-06 10:07:05
对不起,如果它让你感到困惑。我必须大大地解除实际代码的复杂性,以提供我正在做的事情的基础知识。我并不感到惊讶,有些拼写错误淹没了。 – Random 2012-03-06 15:03:55
我认为我们需要比这更多的代码... – 2012-03-07 09:58:44