我有一个单例IObservable,它返回Linq查询的结果。我有另一个类,它侦听IOobservable来构造消息。该类是通过MEF导出的,我可以导入它并从Linq查询中获得异步结果。
我的问题是,在进行初始合成之后,当提供给Linq查询的数据发生更改时,我不会得到任何更改的重新通知。我在singleton上实现了INotifyPropertyChanged,认为它可以使导出的类查询成为新的IObservable,但这并没有发生。
也许我对MEF容器的寿命或属性通知不了解。如果有任何帮助,我将不胜感激。
下面是singleton和导出的类。我省略了一些可以推断的代码,比如PropertyChanged事件处理程序等等。可以说,当基础会话数据发生变化时,这确实有效。单例引发UsersInCurrentSystem的更改事件,但从未从UsersInCCurrentSystem属性请求任何新的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查询的数据发生更改时,我不会得到任何更改的重新通知。
默认情况下,MEF只会组成一次零件。组成零件后,将向所有导入提供相同的实例。除非您明确这样做,否则不会重新创建零件。
在您的情况下,如果零件的数据发生了更改,即使它实现了INotifyPropertyChanged,MEF也不会创建新的,而且您也不需要创建。
我在singleton上实现了INotifyPropertyChanged,认为它可以为新的IObservable 生成导出的类查询
没有。
也许我对MEF容器的寿命或属性通知不了解。
属性通知允许您对属性的更改做出反应,对MEF没有直接影响。至于容器的使用寿命,它将保持活动状态,直到被处理。当它仍然处于活动状态时,容器将保留对其组成部分的引用。事实上,它比这更复杂一点,因为零件可能有不同的CreationPolicy,这会影响MEF持有零件的方式,我请您参阅下一页:零件寿命以了解更多信息。
MEF确实允许一种叫做重组的东西。你可以同样设置:
[Import(AllowRecomposition=true)]
这很难做到的是,当新零件可用或现有零件不再可用时,允许MEF重新组合零件。据我所知,这不是你在问题中所指的。