Event Driven Architecture
事件驅動設計
Last updated
事件驅動設計
Last updated
@Slf4j
@RequiredArgsConstructor
public class NamedEventChannel implements IChannel<NamedEvent> {
private final ChangeNameUseCase changeNameUseCase;
@Override
public void dispatch(NamedEvent message) {
changeNameUseCase.change(message);
}
}
/**
* 使用者
*
*/
@Data
public class UserAggregate {
private String id;// 統一編號
private String name;
private int changeNameCount = 0;// 姓名變更次數
/**
* 輸入正確性名,變更次數小於等於3,取得變更成功事件
*/
@Test
void testCurrentNameAndCountLess3ReturnNamedEvent() {
// GIVE
SubmitNameUseCommand submitNameUseCommand = new SubmitNameUseCommand();
submitNameUseCommand.setId(A123456789);
submitNameUseCommand.setNewNmae(NEW_NAME);
// WHEN
UserAggregate userAggregate = new UserAggregate();
userAggregate.setId(A123456789);
userAggregate.setName(A123456789);
userAggregate.setName(OLD_NAME);
userAggregate.setChangeNameCount(0);
Mockito.when(userAggregateRepository.findById(A123456789)).thenReturn(userAggregate);
// THEN
SubmitNameUseCase submitNameUseCase = new SubmitNameUseCase(userAggregateRepository);
Event event = submitNameUseCase.submit(submitNameUseCommand);
assertThat(event).isExactlyInstanceOf(NamedEvent.class);
NamedEvent namedEvent = (NamedEvent) event;
assertThat(namedEvent.getId()).isEqualTo(A123456789);
assertThat(namedEvent.getNewName()).isEqualTo(NEW_NAME);
assertThat(namedEvent.getOldName()).isEqualTo(OLD_NAME);
assertThat(namedEvent.getChangeNameCount()).isEqualTo(1);
}
@RequiredArgsConstructor
public class SubmitNameUseCase {
private final IUserAggregateRepository userAggregateRepository;
Event submit(SubmitNameUseCommand command) {
UserAggregate user = userAggregateRepository.findById(command.getId());
if (user == null) {
VerifiedFailNameEvent verifiedFailNameEvent = new VerifiedFailNameEvent();
verifiedFailNameEvent.setMessage("帳號不存在:" + command.getId());
return verifiedFailNameEvent;
}
return user.changeName(command);
}
}
@Data
public class UserAggregate {
private String id;// 統一編號
private String name;
private int changeNameCount = 0;// 姓名變更次數
public Event changeName(SubmitNameUseCommand command) {
try {
this.checkchangeName(command);
final NamedEvent namedEvent = new NamedEvent();
namedEvent.setOldName(this.name);
namedEvent.setNewName(command.getNewNmae());
namedEvent.setId(id);
namedEvent.setChangeNameCount(++changeNameCount);
this.name = command.getNewNmae();
return namedEvent;
} catch (ApBusinessException e) {
VerifiedFailNameEvent verifiedFailNameEvent = new VerifiedFailNameEvent();
verifiedFailNameEvent.setMessage(e.getMessage());
return verifiedFailNameEvent;
}
}