Живые существа обновить в совокупности
я уже некоторое время ищу в интернете без особого успеха.
Давайте предположим следующую простую модель, которую я получаю от веб-сервиса.
public class A { public int Id { get; set; } public ObservableCollection Bs { get; set; } public A () { } } public class B { public int Id { get; set; } public ObservableCollection<C> Cs { get; set; } public A Parent { get; set; } public B() { } } public class C { public int Id { get; set; } public B Parent { get; set; } public C() { } }
В моем сценарии реального мира модель будет больше, включая больше уровней / отношений, но для показа моей проблемы этой простой модели должно быть достаточно. Приложение, которое я пишу, загружает агрегат (а) только один раз во время запуска, а затем только слушает изменения. Это означает,что есть запущенная служба, на которую я могу подписаться, которая сообщает мне, когда новые A, B или C добавляются / удаляются или изменяются.
Поэтому я подумал, что было бы удобно создавать репозитории для каждой сущности и позволять каждому репозиторию прослушивать изменения, и это тот момент, когда я застрял прямо сейчас.
public class Repositories { public Repository<A> As { get; set; } public Repository Bs { get; set; } public Repository<C> Cs { get; set; } public Repositories() { } }
Например, Dataservice сообщает mit, что был добавлен новый B, так что теперь должно произойти следующее:
Добавьте его в репозиторий B
Найти родителя и добавить B, чтобы его коллекция Б
Настроить родителей на новый объект Б
или A B был удален, что должно произойти,
Удалить из репозитория
Удалить B от его родителя (A)
Установите для родительского элемента B значение null
Какой самый простой способ сохранить все ссылки? В моей модели реального мира сущность может иметь несколько отношений, а не только одного родителя и список детей.
После дальнейшего исследования я пришел к выводу, что это точно то же самое, что делает Entity framework, когда вы, например, удаляете что-то из набора баз данных. Удаление сущности из набора баз данных приведет также к удалению всех ссылок внутри других сущностей. Поэтому мне нужно то же самое поведение, что и entityframework, кроме того, что я не использую базу данных.
В последние годы я пару раз спотыкался на эту тему и для простоты просто подписался на свои услуги, которые я определил как статические синглеты. Так, например, каждая сущность слушает статическое событие, а затем обновляет себя.
public class A { public int Id { get; set; } public ObservableCollection Bs { get; set; } public A () { DataService.As.OnAdd += OnAdd(); DataService.As.OnDelete += OnDelete(); DataService.As.OnUpdate += OnUpdate(); } }
Это всегда хорошо работало для меня, но у него есть много недостатков, когда дело доходит до модульного тестирования. В этом проекте я пытаюсь отделить проблемы, и я думаю, что сама модель ничего не должна знать о сервисе данных. Кроме того, я думаю, что один репозиторий также не должен ничего знать о других репозиториях (которые мне нужно было бы установить, чтобы найти родителей и установить ссылки). Может быть, я ошибаюсь в этом вопросе.
Таким образом, большой вопрос в конце концов заключается в том, что является лучшим или обычно используемым решением для наличия модели домена с живым обновлением.
Я надеюсь, что мое объяснение будет ясным, и мои "псевдо" модели опишут мою проблему
Что я уже пробовал:
Поискал в интернете похожие сценарии, но безуспешно.
johannesnestler
Я не знаю ваших реальных требований - но я думаю, что очень вероятно, что ваше решение "излишне" - Если вам действительно нужно сделать это так, вам нужен шаблон посетителя (чтобы избежать колец), чтобы пройти через все узлы вашего графика-это трудно получить правильно (рекурсия) и много кода. Мое эмпирическое правило: если что - то становится "сложным", как это - сделайте шаг назад и поставьте под сомнение свой дизайн. например, вы поддерживаете "обратные ссылки" на родителей-действительно ли это нужно и так далее.