У меня есть иерархия объектов, которая является моделью для приложения WPF с использованием шаблона MVVM.Объекты-потомки должны знать о свойстве, которое установлено в корневом объекте иерархии.Свойство может время от времени меняться (оно устанавливается не только при создании иерархии).До того, как это требование появилось, у ребенка не было причины ссылаться на своего родителя или корневой объект.
Упрощенный сокращенный пример:
public class Airplane
public bool IsFlying { get; set}
public ObservableCollection<WingAssembly> WingAssemblies { get; set; }
public class WingAssembly
public void MethodNeedsIsFlyingState() { }
public Flaps Flaps { get; set; }
public class Flaps
public void MethodAlsoNeedsIsFlyingState() { }
Мне встречаются два паттернаЧтобы решить эту проблему:
A) Добавьте ссылку родительского (или корневого) объекта на потомков.
PRO: простое изменение, прямое указание на состояние корневого объекта
CON:Создает двустороннюю иерархию объектов, которая раньше не была нужна ... Я не уверен, с какими последующими последствиями я могу столкнуться (более сложная модель данных?)
B) Добавить свойство IsFlying к объектам-потомкам, которыетребовать этого.Обновлять состояние потомка при изменении состояния root.
PRO: объектная иерархия по-прежнему не требует, чтобы дети знали родителей / root.
CON: легко пропустить необходимое обновление по мере развития модели.Детское состояние IsFlying может быть изменено кем-либо, кроме корневого объекта.Более сложный.
Я склонен вводить ссылку на корень в каждом потомке, но хочу посмотреть, не хватает ли мне более элегантного решения, или я упускаю / недооцениваю важное последствие этогопуть.