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