私は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; } }
}
}
コードサンプルには奇妙なことがたくさんあります。空の静的コンストラクタ、つまりSession.CurrentSystemに相当するLINQクエリがあります。User''、 'UserStatus'コンストラクタの宣言にブラケットがありません。' SingletonObserver.Instance'への参照はおそらく 'SingletonObserver.SingleteonObserverInstance'でなければなりません。私はそれを理解しようとしました。 –
ご迷惑をおかけして申し訳ありません。私がしていたことの基本を提供するために、実際のコードを大幅に複雑化する必要がありました。私はいくつかのタイプミスが入り込んでいるのに驚いていません。 – Random
私はこれよりも多くのコードが必要になると思います... –