Службы RIA WCF / перехватывать или подписываться на RaiseDataMemberChanging - PullRequest
0 голосов
/ 23 сентября 2011

Итак, я новичок в концепции перенаправленных событий, но я знаю, что сообщения разлетаются повсюду, когда поля меняются через сообщения RaiseDataMemberChanging / RaiseDataMemberChanged.

Быстрый вопрос: как мне «прослушать» эти перенаправленные сообщения?

Мне бы хотелось, чтобы моя модель представления в правильном смысле MVVM перехватила сообщение об обновлении поля, глубоко в иерархии таблиц. Если изменение происходит в дочернем элементе (диапазон дат), с этим изменением диапазона дат связана некоторая бизнес-логика, которая работает сверху вниз.

Я знаю, что могу использовать частичные методы для внедрения кода во время изменения и изменения событий, но дизайн (отношение один к одному) означает, что изменение дочернего элемента в контексте дочернего элемента не имеет ссылки родитель (родитель имеет прямую ссылку на ребенка, но ребенок не имеет ссылки на родителя).

Да, я могу добавить ссылку от ребенка к родителю (заставляя родителя иметь отношения как один к одному, так и один ко многим), но при создании сущности это создает проблему - родитель имеет существовать до того, как существует дочерняя сущность, а дочерняя сущность должна существовать до того, как может существовать ссылка на родителя. Этот дизайн требует вставки родительского и дочернего элементов, а затем обновления дочернего, что приводит в замешательство службы WCF RIA во время начального процесса создания.

Извините за длинное объяснение, но я даже рассмотрю изменения дизайна, если все это имеет смысл для тех, кто хочет комментировать.

Любой вклад будет оценен.

1 Ответ

0 голосов
/ 24 сентября 2011

Я использую подписку на события PropertyChanged рассматриваемой сущности.Кажется, что много работы по фильтрации всех событий для пары полей.

Используя RX, я надеюсь, что используемые ресурсы минимальны, а слабая ссылка позволяет избежать проблемы со связью памяти, когдадля обработки событий используется сильная ссылка:

        Observable.FromEventPattern<PropertyChangedEventArgs>(this.FlowEntity, "PropertyChanged")
      .Where(pPropertyChanged => (
                                 pPropertyChanged.EventArgs.PropertyName.EndsWith("Date")) ||
                                 pPropertyChanged.EventArgs.PropertyName == "Capacity"
                                 )
      .Subscribe(pObserver => this.RaiseFlowEntityDateChanged(this, pObserver.EventArgs));

FlowEntity - это дочерняя сущность, которую я отслеживаю от родителя.Затем я вызываю пользовательское событие, используя родительскую сущность, а не сущность, которая фактически содержит событие.

Я не могу вызвать это событие из частичных методов, поскольку у дочерней сущности не будет контекста родительского объекта.

...