MEF и IObservables - PullRequest
       21

MEF и IObservables

0 голосов
/ 05 марта 2012

У меня есть одноэлементная IObservable, которая возвращает результаты запроса Linq.У меня есть другой класс, который слушает IObservable для структурирования сообщения.Этот класс экспортируется через MEF, и я могу импортировать его и получать асинхронные результаты из запроса Linq.

Моя проблема заключается в том, что после первоначальной композиции я не получаю ренотификации изменений, когда предоставляются данныена запрос Linq меняется.Я реализовал INotifyPropertyChanged в синглтоне, думая, что это слово делает запрос экспортируемого класса для нового IObservable, но этого не происходит.

Возможно, я не понимаю что-либо о времени жизни контейнеров MEF или о свойствеуведомление.Буду признателен за любую помощь.

Ниже представлены синглтон и экспортируемый класс.Я пропустил некоторые фрагменты кода, которые можно вывести, например обработчики событий PropertyChanged и тому подобное.Достаточно сказать, что это работает, когда базовые данные сеанса изменяются.Синглтон вызывает событие изменения для UsersInCurrentSystem, но никогда не поступает запрос на новый IObservable из свойства UsersInCurrentSystem.

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 Ответ

1 голос
/ 09 марта 2012

Моя проблема в том, что после первоначальной композиции я не получаю никакой переоценки изменений при изменении данных, предоставленных для запроса Linq.

По умолчанию MEF будет составлять части только один раз. Когда часть будет составлена, один и тот же экземпляр будет предоставлен для всех импортов. Часть не будет воссоздана, если вы не сделаете это явно.

В вашем случае, если данные детали изменятся, даже если она реализует INotifyPropertyChanged, MEF не создаст новую, и вам все равно это не нужно.

Я реализовал INotifyPropertyChanged в синглтоне, думая, что это слово делает запрос экспортируемого класса для нового IObservable

номер

Может быть, я не понимаю что-то о времени жизни контейнеров MEF или об уведомлении о собственности.

Уведомление о недвижимости позволяет вам реагировать на изменение свойства и не имеет прямого влияния на MEF. Что касается срока службы контейнера, он будет оставаться активным, пока не будет утилизирован. Пока он все еще активен, контейнер будет хранить ссылки на составные части. На самом деле это немного сложнее, так как детали могут иметь разные CreationPolicy, которые влияют на то, как MEF хранит деталь, я отсылаю вас на следующую страницу: Срок службы деталей для получения дополнительной информации.

MEF допускает что-то, называемое Перестановка. Вы можете установить его аналогично:

[Import(AllowRecomposition=true)]

То, что это делает жестко, это позволяет MEF перекомпоновывать детали, когда новые детали доступны или уже недоступны. Насколько я понимаю, это не то, на что вы ссылаетесь в своем вопросе.

...