Size: a a a

Software Design/Architecture/Zen

2021 July 12

Ш

Шурик in Software Design/Architecture/Zen
А что должен делать метод update? Объект уже есть в коллекции, он кем-то изменён. Какие действия требуются от коллекции?
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
для тех людей которые называют так методы в репозитории есть отдельный котёл) если вам нужны круды используйте action record
источник

SF

Segmentation Fault in Software Design/Architecture/Zen
Получается что в случае надобности обновления объектов репозиторий не оч подходит?
источник

VG

Valentin Gerbey in Software Design/Architecture/Zen
Идея в том, что ты не раздуваешь интерфейс репозитория, добавляя  левых запросов по типу findAllByValue, а держишь его чистым будто работаешь с коллекцией объектов и используешь только когда надо менять стейт, а не для UI, отправки письма и тому подобное
источник

SF

Segmentation Fault in Software Design/Architecture/Zen
Это здесь при чем?
источник

VG

Valentin Gerbey in Software Design/Architecture/Zen
Попробуй прочитать зачем рекомендуют использовать репу как коллекцию, может быть и вопрос отпадёт
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
репозиторий, если мы говорим именно про "предметный репозиторий", то он работает с агрегатами т.е. это как раз про обновление, вы не будете использовать его в запросах на чтение, для этого есть фабрики запросов
источник

SF

Segmentation Fault in Software Design/Architecture/Zen
Да, про предметный, конечно. Про чтение все понятно. Мне непонятно как им и когда манипулировать судя по всему.
Если считается, что репозиторий скрывает доступ к источнику данных, то по идее он должен отвечать и за то, как эти данные обновлять в источнике.
При этом считается, что репозиторий в тоже время - коллекция.
Как это совместить в одном паттерне- неясно…
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
по правде говоря достаточно скоро используя репозитории вы обнаружите что все что вы в них делаете можно делать компилятором(если он у вас есть), а все что делает их "предметными" может стать частью агрегатов и прочих вещей
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
Ну вот примерно так выглядит репозиторий обычно, а все остальные методы дописываются с предметными именами:
 public abstract class Repository<T>
       where T : AggregateRoot
   {
       public T GetById(long id)
       {
           using (OpenSession())
           {
               return Get<T>(id);
           }
       }

       public void Save(T aggregateRoot)
       {
           using (OpenSession())
           using (BeginTransaction())
           {
               SaveOrUpdate(aggregateRoot);
               Commit();
           }
       }
   }
источник

Kd

Konstantin dmz9 in Software Design/Architecture/Zen
репозиторий только чтение, персистенс уже сказали в самом начале - unit of work.
active record это просто перекладывание ответственности с entity manager из uow в саму сущность (ну и таскание внутри себя ссылки на базу данных или коннекшн к ней, не суть, эскобар)
источник

SF

Segmentation Fault in Software Design/Architecture/Zen
Спасибо
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
если доступ к источнику данных скрывает orm(а мы почти всегда хотим чтобы это было так), то репозитории становятся не особо нужны, репозиторий это не коллекция т.к. он работает с 1 агрегатом
источник

SF

Segmentation Fault in Software Design/Architecture/Zen
А если не сковывает?
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
ну если не скрывает то добро пожаловать в мир php где нужно ручками в репозитории собирать агрегаты
источник

SF

Segmentation Fault in Software Design/Architecture/Zen
Обойдусь
источник

DE

Dmitry Eliseev in Software Design/Architecture/Zen
Либо делаете storage-like репозиторий с методом update и вызываете его каждый раз после изменения.

Либо в репозитории в get, add и remove дополнительно помещаете сущности в UnitOfWork. И эта штука как раз отслеживает изменение сущностей. И потом где-то снаружи вызываете uow.commit() для сохранения результата в БД.
источник

SF

Segmentation Fault in Software Design/Architecture/Zen
Отличный ответ, спасибо!
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
> либо не делаете ссаные репозитории 🙃
источник

AK

Aleh Kashnikau in Software Design/Architecture/Zen
Ручками собирать агрегаты? Зачем в мире пхп так делать?
источник