MEF和IObservables

时间:2012-03-05 18:05:42

标签: mef inotifypropertychanged system.reactive

我有一个单例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; } }
   }
}

1 个答案:

答案 0 :(得分:1)

  

我的问题是,在初始合成发生后,当提供给Linq查询的数据发生变化时,我不会对更改进行任何重新通知。

默认情况下,MEF只会组成一次部件。组成零件时,将向所有导入提供相同的实例。除非您明确这样做,否则不会重新创建该部件。

在您的情况下,如果零件的数据发生变化,即使它实现了INotifyPropertyChanged,MEF也不会创建一个新的,并且您无论如何都不需要。

  

我在单例上实现了INotifyPropertyChanged,认为它为新的IObservable创建导出的类重新查询

没有

  

也许我不了解MEF容器的生命周期或财产通知。

属性通知允许您对属性中的更改做出反应,并且对MEF没有直接影响。至于容器的使用寿命,它将一直处于活动状态,直到它被处理掉。当它仍处于活动状态时,容器将保留对其组成部分的引用。它实际上比这更复杂,因为部件可以有不同的CreationPolicy影响MEF如何保持该部件,我将引用您的以下页面:Parts Lifetime以获取更多信息。

MEF确实允许称为重组的东西。您可以同样设置它:

[Import(AllowRecomposition=true)]

这很难做到的是,当新零件可用或现有零件不再可用时,MEF可以重新组装零件。根据我的理解,这不是你在问题中提到的。