Как правильно создавать объект-сущность?
==========================================

 Часто нужно создать какой-то объект некой сущности в системе.  

  

Например, сущность **Заказ**, эта сущность содержит в себе несколько других сущностей: Товары и Покупатель.  

  

Это не совсем классическая сущность, которая является записью таблиц из бд, а своя, которая может содержать свои свойства и методы (может это как-то называется по другому).  

  

Как мне ранее объясняли здесь, нужно создавать три сущности: Заказ, Покупатель и Товар.  

  

Далее у каждой сущности должен быть некий репозиторий, через который мы можем получать эти сущности через методы, getById, findByCritical и т.д.  

  

Что делать, если не хочется для каждой сущности плодить репозитории ? т.к. по сути для каждой сущности нужен только 1 метод: getById.  

  

Ранее я этот делал так: прямо в конструктор сущности передавал ID, а в конструкторе через API получал данные сущности и заполнял свойства. - это решение никому не понравилось и все критиковали на этом форуме.  

  

Вопрос, какие тогда еще варианты есть ? можно пожалуйста примеры ?  

  

Может в каждой сущности создавать метод-фабрику, createById ? которая будет получать данные сущности, заполнять свойства и делать **return self** ? или как правильно организовать это, чтобы не плодить лишние сузности.  

  

**UPD**  

  

Мне не нравится вариант с репозиториями, т.к.  

1. у каждого репозитория у меня будет только 1 метод. - getById  

2. у каждой сущности у меня по 20 свойств, т.е. из репозитория в конструктор сущности нужно передавать 20 параметров - выглядит чудовищно, решение: создать DTO и передавать в конструктор  

3. получается, еще одно доп. сущность - DTO  

  

В итоге, для каждой сущности, нужно:   

сама сущность + его интерфейс, репозиторий, DTO сущности + классы исключения для репозитория EntityNotFoundException для getById  

  

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

 на самом деле выглядит громоздко, но в этом есть ряд приимуществ.  

1. вы не зависите от слоя хранения, получения  

2. легко накатить тесты  

  

попробуйте организовать вашу логику и работу приложения не концентрируясь на внешнем апи.  

1. создайте сущности+интерфейсы+исключения  

2. создайте тестовый репозитрий реализующий метод получения но с хранением объектов прямо в репо.  

3. реализуйите логику работы с репозиториями и сущностями  

4. покройте код тестами используя тестовый репо, проверьте работу приложения  

5. реализуйте репозиторий работающий с внешним апи, переключите работу приложения на него.  

  

из приемуществ: тестируемый код , маштабируемость в будущем.