У меня есть проект, в котором я использую некоторые доменные модели.
Идентификатор этих моделей является детерминированным и зависит только от содержимого объекта. Два идентичных объекта с одинаковыми свойствами будут иметь одинаковый идентификатор. Это верно для любого объекта моей модели.
Это вычисление является рекурсивным, то есть оно проходит по ссылкам и включает свой собственный идентификатор в вычисление. Это в основном дерево Меркла.
Например, если у меня есть класс A и B, как указано ниже:
public class A {
public string Value { get; }
public B RefToB { get; }
}
Затем я вычислю ID RefToB, затем сериализую все в байты, затем вычислю SHA1 этого байтового массива, чтобы получить другой байтовый массив, который будет моим окончательным идентификатором.
Я буду хранить байты объекта с использованием вычисленного SHA1 в специальном хранилище KeyValue, специально предназначенном для моей цели.
Это позволяет мне очень легко сравнивать поддеревья.
Теперь я не хочу добавлять возможность создания недопустимого объекта модели, поэтому я не могу добавить параметр byte[] id
в конструктор, поскольку он является вычисляемым значением.
Я использую сопоставления моделей DTO <=>, а мой магазин использует DTO для вычисления идентификаторов и хранения данных.
Я стараюсь придерживаться гексагональной архитектуры, что означает, что у меня есть проект Persistence и проект модели домена, у домена нет зависимостей.
Вопрос в том, что я чувствую, что делаю неправильный дизайн, но не могу придумать хорошее объяснение своей неправильной работы. Как вы думаете, я должен сделать этот дизайн по-другому?