При получении обновления для сущности, как предоставить доступ к предыдущим значениям в классе, который не должен понимать входящие DTO? - PullRequest
0 голосов
/ 14 мая 2018

Если есть обновления для некоторой сущности, отправляемой в мой бэкэнд в форме DTO, и у меня есть класс, которому нужен доступ как к предыдущим значениям этой сущности, так и к новым значениям, что является хорошим способом установить это до

Текущий код выглядит примерно так:

//temporarily store old values
SomeReferencedEntity previousReferencedEntity = existingObject.getSomeReferencedEntity();
boolean previouslyEnabled = existingObject.isEnabled();
int previousNumber = existingObject.getNumber();

//update entity with new values
existingObject.setSomeReferencedEntity(newSomeReferencedEntity);    //from dto conversion
existingObject.setEnabled(dto.isEnabled());
existingObject.setNumber(dto.getNumber());

//call other class with new and old values
someExternalSystemAdministrator.update(previousReferencedEntity, previouslyEnabled, previousNumber, existingObject);

Хотя это не похоже на отличный способ сделать это. Так какие у меня варианты?

  • Я думал об экземплярах сущностей из моего DTO, чтобы я мог передать 2 полных объекта (включая ссылки на некоторые другие объекты, которые я должен был бы создать) в мой класс externalSystemAdministrator, поэтому мы можно просто сравнить объект за объектом. Однако это было похоже на злоупотребление класс сущности, который я никогда бы не сохранил для нового значения.
  • Я подумал о передаче нового DTO externalSystemAdministrator класс, но есть довольно много шагов, которые должны быть приняты, прежде чем новые значения понятны для этого учебный класс. Также нехорошо позволять такому классу видеть любого DTO.
  • Я мог бы также создать некоторый простой класс значений для класса externalSystemAdministrator, чтобы обрабатывать и передавать 2 его экземпляра, вместо того, чтобы передавать его объектам моего домена. Сейчас это мой любимый вариант, но это означает, что мне нужно иметь возможность установить некоторые значения для моих реальных сущностей позже, основываясь на ответе внешней системы.

Есть ли более разумный способ настроить это? Желательно в общем / стандартном / общепринятом способе.

1 Ответ

0 голосов
/ 14 мая 2018

Создать событие, которое уведомляет об изменении.Например, у вас будет класс событий, представленный старой и новой версией вашего DTO:

public class ObjectChangedEvent {
  private MyDto oldValue;
  private MyDto newValue;
  ...
}

Тогда код, который вы разместили выше, опубликует событие после обновления сущности:

applicationEventPublisher.publishEvent(objectChangedEvent);

И, наконец, ваш компонент, которому необходимо знать обе версии, будет уведомлен об изменении:

public class MyComponent implements ApplicationListener<ObjectChangedEvent> {

@Override
    public void onApplicationEvent(ObjectChangedEvent event) {
        //your logic goes here
    }

}

Более подробную информацию можно найти здесь

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

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