Рекомендуемый способ хранения и извлечения объектов с наследованием - PullRequest
0 голосов
/ 06 июня 2018

Каков рекомендуемый способ хранения и извлечения объектов, которые наследуют свойства от других объектов в Neo4j?

Модели выглядят следующим образом:

public class Base
{
    public string BaseProperty { get; set; }
}

public class DerivedA : Base
{
    public string DerivedAProperty{ get; set; }
}

public class DerivedB : Base
{
    public string DerivedBProperty{ get; set; }
}

У нас есть много производных моделей.Нашим первым решением было создание транзакции для каждого производного типа, которая также включает свойства из базы.Проблема: всякий раз, когда изменяется Base, мы должны будем изменить все транзакции для всех производных типов.

Следующим решением было написать отдельную транзакцию для Base, которая сначала сохранит свои свойства в neo4j.И затем после определения, какой производный тип, создается другая транзакция, которая сохраняет остальные свойства из производного типа.Таким образом, номер транзакции удваивается, но мы имеем четкое разделение, которое облегчает внесение изменений.

Извлечение еще сложнее.Если мы хотим получить все типы DerivedA, которые хранятся в Neo4j, у нас сначала есть транзакция, которая извлекает базовые свойства.Затем мы определяем производный тип и проводим новую транзакцию, которая извлекает свойства из производного типа.Теперь нам нужно правильно смешать результаты обеих транзакций, чтобы получить полный список производных A со всеми свойствами внутри.

Есть ли более простой / лучший способ?

1 Ответ

0 голосов
/ 06 июня 2018

Хотя у вас широкий вопрос, существует альтернатива наследования.Если это ваш вопрос, я думаю, что он правильный.

Альтернативой для наследования является (например) шаблон декоратора:

Основной принцип (взятый из шаблонов проектирования "голова-в-первых"):

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

Например, из этого ответа здесь :

Подробнее о теме в wikipedia

Я изменю это, чтобы быть более представительным.

public interface IStudent //this would rather be called an IInformationDisplayer
{
     string DisplayInformation();
}

public class Student : IStudent
{
    public string Name, Grade, Age, etc... { get; set; }
    private IStudent _student = null;

    public Student() { }
    public Student(IStudent student) {  _student = student; }

    public string DisplayInformation()
    {
        return $"{_student?.DisplayInformation()}" + 
               $"{Name} - {Age} years old is in {Grade} grade";
    }
}

public class ScienceStudent : IStudent //it's still a decorator
{
    public string Labs { get; set; }
    private IStudent _student;
    public ScienceStudentDecorator(IStudent student)
    {
        _student = student;
    }

    public string DisplayInformation()
    {
        var info =  _student?.DisplayInformation();
        return $"{info}. Labse are {Labs}";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...