Как разработать модель с сгенерированным идентификатором - PullRequest
0 голосов
/ 05 июня 2019

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

Это вычисление является рекурсивным, то есть оно проходит по ссылкам и включает свой собственный идентификатор в вычисление. Это в основном дерево Меркла.

Например, если у меня есть класс A и B, как указано ниже:

public class A {
   public string Value { get; }
   public B RefToB { get; }
}

Затем я вычислю ID RefToB, затем сериализую все в байты, затем вычислю SHA1 этого байтового массива, чтобы получить другой байтовый массив, который будет моим окончательным идентификатором.

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

Это позволяет мне очень легко сравнивать поддеревья.

Теперь я не хочу добавлять возможность создания недопустимого объекта модели, поэтому я не могу добавить параметр byte[] id в конструктор, поскольку он является вычисляемым значением.

Я использую сопоставления моделей DTO <=>, а мой магазин использует DTO для вычисления идентификаторов и хранения данных.

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

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

1 Ответ

0 голосов
/ 05 июня 2019

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

В java, как hashCode, она рассчитывается внутри объекта.

Это не ваша DTO работа, это ваш собственный объект.Сделав это, вы сделаете их более правильными, невозможными для взлома и передачи неправильного значения, которое сделает недействительной вашу модель, а также упростит тестирование: создайте два разных объекта с одинаковыми значениями и проверьте, что их идентификаторы равны.Очень просто!

Если вы хотите применить к изменяемым объектам то же самое, просто вычислите ваш ID на лету, а не при создании экземпляра в конструкторе.

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