MEF and IObservables



我有一个单例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重新组合零件。据我所知,这不是你在问题中所指的。

最新更新