2012-03-05 15 views
0

我有一个单身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; } } 
    } 
} 
+1

代码示例中有很多奇怪的东西:你有一个空的静态构造函数,一个LINQ查询,它等同于'Session.CurrentSystem。用户','UserStatus'构造函数声明中缺少括号,'SingletonObserver.Instance'可能应该是'SingletonObserver.SingleteonObserverInstance'的引用......我放弃了试图理解它。 – 2012-03-06 10:07:05

+0

对不起,如果它让你感到困惑。我必须大大地解除实际代码的复杂性,以提供我正在做的事情的基础知识。我并不感到惊讶,有些拼写错误淹没了。 – Random 2012-03-06 15:03:55

+1

我认为我们需要比这更多的代码... – 2012-03-07 09:58:44

回答

1

我的问题是,最初的组成发生之后,我没有得到的时候提供给LINQ查询变化的数据变化的任何再通知。

默认情况下,MEF只会组成零件一次。零件组成完成后,相同的实例将被提供给所有的进口。除非明确这样做,否则将不会重新创建该部分。

就你而言,如果零件的数据发生变化,即使它实现INotifyPropertyChanged,MEF也不会创建新的零件,而且您也不需要。

我实现INotifyPropertyChanged的上单,以为这词使出口类重新查询新的IObservable

也许我不理解的东西有关的寿命MEF容器,或关于财产通知。

属性通知允许您对属性的更改作出反应并且对MEF没有直接影响。至于集装箱的使用寿命,它将一直保持活跃状态​​,直至其被处置。虽然它仍处于活动状态,但容器将保留对其组成部分的引用。实际上它比这更复杂一点,因为零件可能具有不同的CreationPolicy,它会影响MEF如何保持零件,所以我参考以下页面:Parts Lifetime了解更多信息。

MEF允许使用称为重组的东西。同样,可以将其设置:

[Import(AllowRecomposition=true)] 

这里做艰难的就是让MEF以重新组织零件时,新部件可用的或现有的部分不再可用。根据我的理解,这不是你所指的问题。