m.bleimuth Ответов: 0

Живые существа обновить в совокупности


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

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

Я не знаю ваших реальных требований - но я думаю, что очень вероятно, что ваше решение "излишне" - Если вам действительно нужно сделать это так, вам нужен шаблон посетителя (чтобы избежать колец), чтобы пройти через все узлы вашего графика-это трудно получить правильно (рекурсия) и много кода. Мое эмпирическое правило: если что - то становится "сложным", как это - сделайте шаг назад и поставьте под сомнение свой дизайн. например, вы поддерживаете "обратные ссылки" на родителей-действительно ли это нужно и так далее.

0 Ответов