2012-03-05 1 views
0

私はLinqクエリの結果を返すシングルトンIObservableを持っています。メッセージを構造化するためにIObservableをリッスンする別のクラスがあります。そのクラスはMEFを介してエクスポートされており、インポートしてLinqクエリから非同期の結果を得ることができます。MEFとIObservables

私の問題は、最初の合成が行われた後で、Linqクエリに提供されたデータが変更されたときに、変更に関する変更を取得しないということです。私はシングルトンにINotifyPropertyChangedを実装し、新しいIObservableのエクスポートされたクラスのクエリーを作成すると思っていましたが、これは起こりません。

多分私は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

コードサンプルには奇妙なことがたくさんあります。空の静的コンストラクタ、つまりSession.CurrentSystemに相当するLINQクエリがあります。User''、 'UserStatus'コンストラクタの宣言にブラケットがありません。' SingletonObserver.Instance'への参照はおそらく 'SingletonObserver.SingleteonObserverInstance'でなければなりません。私はそれを理解しようとしました。 –

+0

ご迷惑をおかけして申し訳ありません。私がしていたことの基本を提供するために、実際のコードを大幅に複雑化する必要がありました。私はいくつかのタイプミスが入り込んでいるのに驚いていません。 – Random

+1

私はこれよりも多くのコードが必要になると思います... –

答えて

1

私の問題は、初期組成が行われた後、私はデータは、LINQクエリの変更に供給された変更の任意のrenotificationを取得しないということです。

デフォルトでは、MEFはパーツを1回だけ作成します。部品が合成されると、同じインスタンスがすべてのインポートに供給されます。あなたが明示的にそうしない限り、パーツは再作成されません。

あなたのケースでは、部品のデータが変更された場合、INotifyPropertyChangedを実装しても、MEFは新しいものを作成せず、とにかく必要はありません。

私はそれが単語たぶん私はの寿命について何かを理解していないよ新しいIObservable

用にエクスポートクラスの再クエリを作る考え、シングルトンにINotifyPropertyChangedのを実装MEFコンテナー、またはプロパティー通知について。

プロパティ通知を使用すると、プロパティの変更に反応することができ、MEFに直接影響はありません。コンテナの寿命は、処分されるまで有効です。それがまだアクティブな間、コンテナはそのコンポーズパーツへの参照を保持します。実際にはそれより複雑ですが、MEFが部品を保持する方法に影響を与えるCreationPolicyを部品が持つことができるため、詳細はParts Lifetimeを参照してください。

MEFは再構成と呼ばれるものを許可します。あなたは同様にそれを設定することができます。これは厳しい何

[Import(AllowRecomposition=true)] 

は新しいパーツが入手可能であるか、または既存の部品はもう利用できない場合MEFは、部品を再構成することが可能です。私が理解していることから、あなたの質問であなたが言及しているものではありません。